寄生コンストラクター パターンは、ファクトリ パターンとコンストラクター パターンの組み合わせと見なすことができます。ファクトリ パターンでは、オブジェクトを明示的に作成し、必要なプロパティとメソッドをオブジェクトに追加して、最終的にオブジェクトを返す関数を呼び出します。
function createPerson(name, age, job){
var o = new Object(); //explicit object creation
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);
var person2 = createPerson(“Greg”, 27, “Doctor”);
注意事項:
- 明示的なオブジェクトが作成されて返されます
- メソッドとプロパティが明示的に作成されたオブジェクトに追加されます
- メソッドは
new演算子なしで呼び出されます
欠点: オブジェクトのタイプを識別できません。
任意の関数を演算子で呼び出すことにより、コンストラクターとして扱うことができますnew。new演算子なしで呼び出された場合、関数内では、thisオブジェクトはグローバル オブジェクト (windowブラウザー内) を指します。そして、関数がnew演算子で呼び出されると、最初に の新しいインスタンスを作成し、object次にthisobject を新しく作成されたオブジェクトに設定します。
コンストラクター パターンはメソッドとプロパティをthisオブジェクトに追加し、最終的にthisオブジェクトを返すため、後で演算子を使用してオブジェクトの型を識別できますinstanceOf。
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person(“Nicholas”, 29, “Software Engineer”);
var person2 = new Person(“Greg”, 27, “Doctor”);
注意事項:
- function は
newoperator で呼び出されます (JavaScript エンジンにコンストラクターとして扱わせるため) - オブジェクトは明示的に作成されず、代わりに
thisオブジェクトが返されます
寄生コンストラクター パターンは、ファクトリ パターンに似たオブジェクトを明示的に作成して返し、コンストラクター パターンのような新しい演算子で呼び出されます。
function Person(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var friend = new Person(“Nicholas”, 29, “Software Engineer”);
friend.sayName(); //”Nicholas”
newただし、演算子を使用して関数を呼び出す方法はわかりません。instanceOfつまり、関数はオブジェクトを明示的に作成して返すため、演算子を使用してオブジェクトの種類を明示的に識別することはできません。
では、寄生コンストラクター パターンの何が優れているのでしょうか。特定のオブジェクト作成シナリオで活用または適切に使用できる技術的な微妙な点はありますか? または、オブジェクトを作成するためのプログラムによる別のアプローチはありますか?