寄生コンストラクター パターンは、ファクトリ パターンとコンストラクター パターンの組み合わせと見なすことができます。ファクトリ パターンでは、オブジェクトを明示的に作成し、必要なプロパティとメソッドをオブジェクトに追加して、最終的にオブジェクトを返す関数を呼び出します。
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
次にthis
object を新しく作成されたオブジェクトに設定します。
コンストラクター パターンはメソッドとプロパティを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 は
new
operator で呼び出されます (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
つまり、関数はオブジェクトを明示的に作成して返すため、演算子を使用してオブジェクトの種類を明示的に識別することはできません。
では、寄生コンストラクター パターンの何が優れているのでしょうか。特定のオブジェクト作成シナリオで活用または適切に使用できる技術的な微妙な点はありますか? または、オブジェクトを作成するためのプログラムによる別のアプローチはありますか?