1. ファクトリ メソッド 私自身の理解: オブジェクトのインスタンスを多数作成するには、これらのインスタンスは同じ属性を持ちますが、異なる属性値を持ちます。このとき、ファクトリー関数を作成する必要があります。
ファクトリ関数: 特定のタイプのオブジェクトを作成して返します。
ファクトリ関数内の属性がメソッドである場合、ファクトリ関数の外でオブジェクトのメソッドを定義し、属性を通じてそのメソッドを指すことができるため、毎回独自の属性メソッドを呼び出す必要がなくなります。このように、各オブジェクトはすべて同じ機能を共有します。
例:
<スクリプト タイプ="text /javascript">
//ファクトリの外でオブジェクトを定義する方法 function
function ShowNameFn() {
alert(this.Name)
}
//オブジェクトを作成するファクトリーモードでは
function CreatBOFn(sName, iAge, bSex) {
var BO = new Object();
BO.Name = sName;
BO.Age = iAge; Sex = bSex;
BO.ShowName = ShowNameFn; //このプロパティは実際には関数へのポインタです。
}
//ボタンのテスト呼び出し
関数() {
var operson1 = CreatBOFn("Zhang San", 18, true); // インスタンスの作成は、実際にはメソッドを直接呼び出します。 /script>
概要: ファクトリ関数はこのようにクラスまたはオブジェクトを定義し、インスタンスを作成するときにこのファクトリ関数を呼び出します。
2. コンストラクター メソッド
最初のステップは、コンストラクターの名前であるクラス名を選択することです。以下のコードを見てください。上記のファクトリー関数と似ていることがわかります。
例:
コードをコピー
this.Money = お金;
alert(this.Money);
>//ボタン呼び出しテスト
function NewCarFn() {
var Car1 = new Car("red", "230,000 RMB");
Car1.ShowMoney(); /------------------------------------------------ - ---------
前のファクトリ関数メソッドとの違いの比較:
① コンストラクター内にオブジェクトは作成されませんが、this キーワードが使用されます。
② new 演算子を使用してコンストラクターを呼び出します。
3. プロトタイプ メソッド
オブジェクトのプロトタイプ属性を使用すると、それを新しいオブジェクトを作成するプロトタイプとみなし、空のコンストラクターを使用してクラス名を設定し、プロパティとメソッドには、prototype 属性が直接割り当てられます。
プロトタイプ メソッドの問題点:
まず、このコンストラクターにはパラメーターがありません。プロトタイプ メソッドを使用する場合、コンストラクターにパラメーターを渡して属性の値を初期化することはできません。オブジェクトの作成後にプロパティのデフォルト値を変更する必要があります。
第 2 に、属性が関数ではなくオブジェクトを指している場合、そのオブジェクトは複数のインスタンスによって共有され、そのうちの 1 つが変更されると、他のオブジェクトも変更されます。
例:
コードをコピー コードは次のとおりです:
//最初に定義します空のコンストラクター
alert(Car2.Drivers); //インスタンス 2 では、オブジェクトの値が変更されました。出力 "小三,小四,小五"
4. コンストラクターとプロトタイプ メソッドの混合
コンストラクターとプロトタイプ メソッドを組み合わせて使用すると、コンストラクターとプロトタイプを使用できます。他の言語と同様にメソッドをまとめて同じ方法でオブジェクトを作成します。
コンストラクターはオブジェクトのすべての非機能プロパティを定義し、プロトタイプはオブジェクトの機能プロパティ (メソッド) を定義します。
例:
コードをコピー
コードは次のとおりです:
function BOStudent(name,age) {
this.Name = name;
this.Age = 年齢;
this.Course = new Array("中国語","数学") ;
}
BOStudent.prototype.ShowName = function() {
alert(this.name)
};
function Admixture() をデバッグするには、ボタンをクリックします。 {
var stu1 = new BOStudent("Zhang San", 20); //最初の BO を新規作成します
var stu2 = new BOStudent("Li Si", 22); // 2 番目の BO を新規作成します
stu1.course.push("Physics"); //物理コース項目をオブジェクト 1 に追加します。
alert(stu1.course)
;
コンストラクターとプロトタイプの混合アプローチは、ECMAScript で採用されている主なアプローチであり、副作用のない他のアプローチの特徴を備えています。
5. 動的プロトタイプ メソッド
ほとんどのオブジェクト指向言語では、クラスを定義するときに属性とメソッドがパッケージ化されます。上記のハイブリッド コンストラクター/プロトタイプ メソッドでは、属性とメソッドが分離されているため、コンストラクターの内部に属性があり、外部にメソッドがあるのは非論理的であると考える人もいます。そのため、動的プロトタイプ メソッドが生まれました。 違いは、オブジェクトに割り当てられたメソッドの場所が異なることです。動的プロトタイプ メソッドはコンストラクターの内部にありますが、上記の 4 番目のメソッドはコンストラクターの外部にあります。
例:
コードをコピー
コードは次のとおりです。 function BODynamicPrototype(name) , age) {
this.Name = name; this.Course = new Array("111", "222");
//_initialized フラグ初期化されています。つまり、プロトタイプにメソッドが割り当てられているかどうかに関係なく、メソッドは 1 回だけ作成され割り当てられます。
if (typeof BODynamicPrototype._initialized == "unknown") {
BODynamicPrototype.prototype.ShowName = function() {
alert(this.Name);
BODynamicPrototype._initialized = true;
}
} // ボタンをクリックしてデバッグします
function DynamicPrototype() {
var stu1 = new BODynamicPrototype("aaa", 20); // 新しい最初の BO
var stu2 = new BODynamicPrototype("bbb", 22);
stu1.Course .push("333"); //物理コース項目をオブジェクト 1 に追加します
alert(stu2.course);
6. 混合ファクトリ メソッド
その目的は、別のオブジェクトの新しいインスタンスのみを返す偽のコンストラクターを作成することです。このアプローチには、オブジェクト メソッドの内部管理という点で従来のアプローチと同じ問題があります。強く推奨: 絶対に必要な場合を除き、使用を避けてください。