javascript高級なプログラムの設計のいくつかの経典は受け継ぎます.

20743 ワード

記事の目次
  • 構造方法継承
  • プロトタイプチェーンは
  • を継承します.
  • グループ継続
  • プロトタイプは
  • を継承します.
  • 寄生式引継ぎ
  • 寄生結合式継承
  • 参考:https://www.jianshu.com/p/85899e287694
    構造方法引継ぎ
    利点:
  • は、親にcallを利用したパラメータリストを送ることができる
  • .
  • は、すべての属性がインスタンスによって共有されることを回避する
  • .
    短所:
  • 例を作成していないので、方法を作成します.
  • は、親クラスの例示的な属性と方法だけを継承することができ、プロトタイプの属性と方法
  • を継承することができません.
    
    function Parent(name){
         
      this.name = name||'default_name';
    
      this.getInfo =function(){
         
        return this.name
      }
    }
    
    Parent.prototype.say = function(){
         
      console.log('hello');
    }
    
    function Child(name){
         
      Parent.call(this,name)
    }
    
    var child1 = new Child(['a']);
    console.log(child1.name);// ["a"]
    // child1.say(); //                 ,            
    // child1.name.push('Bob')
    console.log(child1.getInfo()); // ["a"]
    
    var child2 = new Child();
    console.log(child2.getInfo());//["default_name"]
    
    
    プロトタイプチェーン引継ぎ
    特徴:すべてのインスタンスの共有属性と方法
    function Parent(){
         
      this.name = ['sartre']
    }
    
    Parent.prototype.getName = function(){
         
      return this.name;
    }
    
    function Child(){
         
    
    }
    
    Child.prototype = new Parent()
    
    var child1 = new Child();
    console.log(child1.name); //["sartre"]
    
    child1.name.push('mark') 
    console.log(child1.name); // ["sartre", "mark"]
    
    var child2 = new Child();
    console.log(child2.name); // ["sartre", "mark"]
    
    
    グループ引継ぎ
    融合前の2つの点は、プロトタイプ方法を共有することができ、アプリケーション属性共有の問題が存在しないため、生成された例は、サブクラスのインスタンスであり、アドバンテージ親タイプの例である.
    function Parent(name){
         
      this.name = name;
      this.hobbies = ['guitar','run','ball'];
    }
    
    Parent.prototype.getName = function(){
         
      console.log(this.name);
    }
    
    function Child(name,age){
         
      Parent.call(this,name);
      this.age = age || 20;
    }
    
    //                     
    Child.prototype = new Parent();
    child.prototype.constructor = Child;
    
    var child1 = new Child('sartre','20');
    
    child1.hobbies.push('swim')
    
    console.log(child1.name);
    console.log(child1.age);
    console.log(child1.hobbies);
    
    var child2 = new Child('mark');
    
    console.log(child1.name);
    console.log(child1.age);
    console.log(child1.hobbies);
    
    プロトタイプ継承
    function createObj(o){
         
      function F(){
         
    
      }
    
      F.prototype = o;
      return new F();
    }
    
    //    ES5 Object.create                       
    
    //   :
    //                     ,          
    
    var person = {
         
      name:'kevin',
      friends:['daisy','kelly']
    }
    
    var person1 = createObj(person);
    var person2 = createObj(person)
    
    person1.name = 'person1';
    console.log(person2.name); //kevin            person2.name     
    
    person1.friends.push('taylor');
    
    console.log(person2.friends); // ["daisy", "kelly", "taylor"]
    
    
    寄生式引継ぎ
    この方式の継承は構造関数の継承方式と同じである.
    function createObj(o){
         
      var clone = Object.create(o);
      clone.sayName = function(){
         
        console.log('hi');
      }
      return clone;
    }
    
    寄生ユニット引き継ぎ
    この継承方法は、前の組み合わせの継承をさらに改善するための組み合わせです.欠点は、父の構造関数を2回呼び出すことです.
  • 初めてサブタイプインスタンスのプロトタイプを設定したときChild.prototype=new Part()
  • は、サブタイプのインスタンスを作成するとき
  • である.
  • var child 1=new Child(‘kevin’,18);ここでnew方法を実行すると、Partent.callがPart構造関数
  • を呼び出します.
    function Parent (name) {
         
      this.name = name;
      this.colors = ['red', 'blue', 'green'];
    }
    
    Parent.prototype.getName = function () {
         
      console.log(this.name)
    }
    
    function Child (name, age) {
         
      Parent.call(this, name);
      this.age = age;
    }
    
    
    //         Child.prototype = new Parent() ,
    //        Child.prototype     Parent.prototype  ?
    var F = function(){
         
    
    }
    F.prototype = Parent.prototype
    
    Child.prototype = new F();