1.プロトタイプ継承の起源:
Crockfordは、継承を実装するメソッドを導入しました。このメソッドは、厳密な意味でコンストラクターを使用せず、代わりに、カスタムタイプを作成せずに、プロトタイプを使用して既存のオブジェクトに基づいて新しいオブジェクトを作成します。
与えられた機能は次のとおりです。
function Object(o){
// 临时性的构造函数
function F() {}
F.prototype = o;
return new F();
}
説明:
(1)オブジェクト関数内では、最初に一時コンストラクターが作成され、渡されたオブジェクトがコンストラクターのプロトタイプとして使用されます。(2)lastは、この一時タイプの新しいインスタンスを返します。
(3)本質的に、object()は渡されたオブジェクトの浅いコピーを実行します。
2.プロトタイプの継承:
例は次のとおりです。
function Object(o){
// 临时性的构造函数
function F() {}
F.prototype = o;
return new F();
}
var person = {
name:"萝卜头",
friends:["1","2","3"]
};
var anotherPerson = Object(person);
anotherPerson.name="大萝卜头";
anotherPerson.friends.push("5");
var anotherPerson2 = Object(person);
anotherPerson2.name="萝卜干";
anotherPerson2.friends.push("7");
console.log(person.friends);
コードの説明:
この例では、別のオブジェクトの基礎として使用できるpersonオブジェクトがObject関数に渡され、関数は新しいオブジェクトを返します。この新しいオブジェクトにはプロトタイプとして人物が含まれるため、そのプロトタイプには基本型値属性と参照型値属性が含まれています。person.friendsは、personが所有するだけでなく、anotherPersonとanotherPerson2も共有します。
注:この種のプロトタイプの継承では、別のオブジェクトの基礎として使用できるオブジェクトが必要です。そのようなオブジェクトがある場合は、それをobject()関数に渡して、取得したオブジェクトに1つの変更を追加できます。特定のニーズに応じて。
3.改善:
ES5は、新しいObject.create()メソッドを介してプロトタイプの継承を標準化します。このメソッドは、新しいオブジェクトのプロトタイプとして使用されるオブジェクトと、新しいオブジェクトの追加のプロパティを定義するオブジェクトの2つのパラメーターを受け入れます。
var person = {
name:"萝卜头",
friends:["1","2","3"]
};
var anotherPerson = Object.create(person,{
name:{
value:"大萝卜头"
}
});
anotherPerson.friends.push("5");
var anotherPerson2 = Object.create(person,{
name:{
value:"萝卜干"
}
});
anotherPerson2.friends.push("7");
console.log(person.friends);
プロトタイプの継承は、あるオブジェクトを別のオブジェクトに類似させたい場合に適しています。ただし、参照型の値を含むプロパティは、プロトタイプパターンを使用する場合と同様に、常に目的の値を共有します。
注:詳細については、「JavaScriptAdvancedProgramming」を参照してください。