JAvascript継承メカニズムの概要


***一、プロトタイプチェーン継承前節では、各コンストラクション関数にプロトタイプオブジェクトがあり、プロトタイプオブジェクトにはコンストラクション関数を指すポインタが含まれ、インスタンスにはプロトタイプを指す内部ポインタが含まれていることを知っています.では、1つのプロトタイプオブジェクトを別のタイプのインスタンスに等しくすると、そのときのプロトタイプオブジェクトには別のプロトタイプを指すポインタが含まれ、もう1つのプロトタイプオブジェクトには別のタイプを指す構造関数ポインタが含まれており、このように段階的に進み、インスタンスとプロトタイプのチェーンを構成し、継承を実現します.
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はこのように実現された継承が新しいプラグインを作成することに達する