JAvascript継承メカニズムの概要
7393 ワード
***一、プロトタイプチェーン継承前節では、各コンストラクション関数にプロトタイプオブジェクトがあり、プロトタイプオブジェクトにはコンストラクション関数を指すポインタが含まれ、インスタンスにはプロトタイプを指す内部ポインタが含まれていることを知っています.では、1つのプロトタイプオブジェクトを別のタイプのインスタンスに等しくすると、そのときのプロトタイプオブジェクトには別のプロトタイプを指すポインタが含まれ、もう1つのプロトタイプオブジェクトには別のタイプを指す構造関数ポインタが含まれており、このように段階的に進み、インスタンスとプロトタイプのチェーンを構成し、継承を実現します.
例からdogインスタンスはAnimalのプロトタイプメソッドと属性を継承していることが分かる.共有性のため、親コンストラクション関数に参照プロパティがある場合、異なるインスタンスの変更が共有され、2番目の問題は、サブタイプのインスタンスを作成して親コンストラクション関数のようにパラメータを渡すことができないことです.プロトタイプチェーンの注意点:1、サブタイププロトタイプの追加方法のコードは必ずプロトタイプの文を置き換えた後、上記の例のようにしなければならない.2、サブタイプのプロトタイプの追加方法ではプロトタイプの字面量は使用できません.これはプロトタイプオブジェクトを書き換え、親タイプのコンストラクション関数とのつながりを切断し、継承を失うためです.二、組合せ継承プロトタイプチェーンと構造関数を組み合わせて、両者の長さを発揮する継承モードであり、プロトタイプチェーンを用いてプロトタイプ属性と方法の継承を実現し、構造関数を借りてインスタンス属性の継承を実現する.
これにより、サブタイプのコンストラクション関数から親タイプのコンストラクション関数を呼び出し、親タイプにパラメータを渡すことができ、サブタイプが作成したインスタンスが独自の属性を持ち、プロトタイプオブジェクトに共通の方法も持つことを保証します.しかし、これは、サブコンストラクション関数で親コンストラクション関数を呼び出して属性の継承を実現し、サブタイプのプロトタイプを親タイプのインスタンスに指向することで、属性の重複をもたらし、インスタンスの属性がプロトタイプの属性を上書きしているだけで、呼び出されていないという問題があります.三、プロトタイプ継承ダグラスが提案したプロトタイプによって、既存のオブジェクトに基づいて新しいオブジェクトを作成することができ、カスタムタイプを作成する必要はありません.
もう1つのコンストラクション関数を利用していない継承はコピーであり,新しいオブジェクトをターゲットオブジェクトにコピーし,新しいオブジェクトに戻り,継承を実現する.
Doctorはextendによって任意の転送されたオブジェクトの属性と方法を継承することができます.Jqueryのextend(object)と.fn.extendはこのように実現された継承が新しいプラグインを作成することに達する
function Animal(){
this.type="animal";
}
Animal.prototype.getType=function(){
return this.type;
}
function Dog(){
this.name="dog";
}
Dog.prototype=new Animal();
Dog.prototype.getName=function(){
return this.name;
}
var dog=new Dog();
alert(dog.getType()) //animal
例からdogインスタンスはAnimalのプロトタイプメソッドと属性を継承していることが分かる.共有性のため、親コンストラクション関数に参照プロパティがある場合、異なるインスタンスの変更が共有され、2番目の問題は、サブタイプのインスタンスを作成して親コンストラクション関数のようにパラメータを渡すことができないことです.プロトタイプチェーンの注意点:1、サブタイププロトタイプの追加方法のコードは必ずプロトタイプの文を置き換えた後、上記の例のようにしなければならない.2、サブタイプのプロトタイプの追加方法ではプロトタイプの字面量は使用できません.これはプロトタイプオブジェクトを書き換え、親タイプのコンストラクション関数とのつながりを切断し、継承を失うためです.二、組合せ継承プロトタイプチェーンと構造関数を組み合わせて、両者の長さを発揮する継承モードであり、プロトタイプチェーンを用いてプロトタイプ属性と方法の継承を実現し、構造関数を借りてインスタンス属性の継承を実現する.
function Animal(type){
this.type=type;
this.all=["rabbit","chicken","cow"];
}
Animal.prototype.getType=function(){
alert(this.type);
}
function Dog(type,name){
Animal.call(this,type);
this.name=name;
}
Dog.prototype=new Animal();
Dog.prototype.constructor=Dog;
Dog.prototype.getName=function(){
alert(this.name);
}
var dog=new Dog("dog"," ");
dog.all.push("dog");
alert(dog.all); //rabbit,chicken,cow,dog
dog.getType(); //dog
dog.getName(); //
var dog2=new Dog("dog "," ");
dog2.all.push("dog ");
alert(dog2.all); //rabbit,chicken,cow,dog
dog2.getType(); //dog
dog2.getName(); //
これにより、サブタイプのコンストラクション関数から親タイプのコンストラクション関数を呼び出し、親タイプにパラメータを渡すことができ、サブタイプが作成したインスタンスが独自の属性を持ち、プロトタイプオブジェクトに共通の方法も持つことを保証します.しかし、これは、サブコンストラクション関数で親コンストラクション関数を呼び出して属性の継承を実現し、サブタイプのプロトタイプを親タイプのインスタンスに指向することで、属性の重複をもたらし、インスタンスの属性がプロトタイプの属性を上書きしているだけで、呼び出されていないという問題があります.三、プロトタイプ継承ダグラスが提案したプロトタイプによって、既存のオブジェクトに基づいて新しいオブジェクトを作成することができ、カスタムタイプを作成する必要はありません.
function object(o){
function F(){}
F.prototype=o;
return new F();
}
, 。 , 。
var animal={
type:"animal",
all:['rabbit','cow','cat'],
}
var dog=object(animal);
dog.name="dogg";
dog.all.push('dog');
alert(dog.type);
alert(dog.all);
es5 objetc.create() , 2 , ,
* 、 *
, , , , Dog.prototype=new Animal(); 。
inheritPrototype(animal,dog);
function inheritPrototype(animal,dog){
var prototype=Object(animal.prototype);
prototype.constructor=dog;
dog.prototype=prototype;
}
もう1つのコンストラクション関数を利用していない継承はコピーであり,新しいオブジェクトをターゲットオブジェクトにコピーし,新しいオブジェクトに戻り,継承を実現する.
var Doctor={
say:function(){
alert(" ");
}
};
var Copy=function (p) {
var c = {};
c=this;
for (var i in p) {
c[i] = p[i];
}
c.uber = p;
return c;
}
Doctor.extend=Copy;
Doctor.extend({
test:function(){
alert(" ");
}
})
Doctor.say(); //
Doctor.test(); //
Doctorはextendによって任意の転送されたオブジェクトの属性と方法を継承することができます.Jqueryのextend(object)と.fn.extendはこのように実現された継承が新しいプラグインを作成することに達する