JavaScript継承方式:プロトタイプチェーン、組合せ、寄生組み合わせ


プロトタイプチェーン引継ぎ
let Parent = function() {
    this.name = [‘parent']
}

Parent.prototype.sayName = function() {
    console.log(this.name)
}

let Child = function(){}

Child.prototype = new Parent() //     

let child1 = new Child()
child1.sayName() //[‘parent’]

child1.name.push(‘child’) 
let child2 = new Child()
child2.sayName() //[‘parent’, ‘child']
問題:
  • したがって、実例は参照タイプの属性を共有し、変更は全部変更する.
  • 、かつ、childインスタンスを作成すると、Partentに
  • を転送できない.
    コンビネーション継承
    これはJavaScriptで最もよく使われている継承モードです.
    let Parent = function(name){
        this.name = name
        this.staff = [‘a']
    }
    
    Parent.prototype.sayName = function(){
        console.log(this.name)
    }
    Parent.prototype.showStaff = function(){
        console.log(this.staff)
    }
    
    let Child = function(name){
        Parent.call(this, name) //   Parent     ,       (   )
    }
    
    Child.prototype = new Parent() //    Parent        (   )
    
    let child1 = new Child(‘child1’)
    let child2 = new Child(‘child2’)
    
    child1.sayName() //child1
    child2.sayName() //child2
    
    child1.staff.push(‘child1’)
    child1.showStaff() //[‘a’, ‘child1’]
    child2.showStaff() //[‘a’]
    問題:Parentアーキテクチャー関数を2回呼び出して、それぞれChild.prototypechildの例の2つのオブジェクトにParentnameの属性があるようにします.
    寄生グループ引き継ぎ
    キー:
    第1回の呼び出しに対しては、staffChild.prototypeの属性があるようにすることが避けられます.
    方法:
  • 空の関数を作成して中継します.
  • は、ParentのプロトタイプChild=空関数の例を譲る.
  • は、空関数のプロトタイプChild.prototypeを譲る.
  • コードの説明
    let F = function() {};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    これにより、F.prototype = Parent.prototypechildを介して__proto__、すなわちChild.prototypeを指し、fを介して__proto__、すなわちF.prototypeを指す.
    実は、上記の考えはParent.prototypeの実現です.
    コードで説明:
    function create (obj) {
        let F = function(){}
        F.prototype = obj
        return new F()
    }
    Object.create()のために、Child.prototype = new F()などの指し示しを新たにする必要があります.
    function inheritPrototype (subType, superType) {
        let prototype = Object.create(superType.prototype)
        subType.prototype = prototype
        prototype.constructor = subType
    寄生コンビネーション引継ぎコード
    let Parent = function(name){
        this.name = name
        this.staff = [1]
    }
    
    Parent.prototype.sayName = function(){
        console.log(this.name)
    }
    
    Parent.prototype.showStaff = function(){
        console.log(this.staff)
    }
    
    let Child = function(name){
        Parent.call(this, name)
    }
    
    //Child.prototype = new Parent()
    
    function inheritPrototype (subType, superType) {
        let prototype = Object.create(superType.prototype)
        subType.prototype = prototype
        prototype.constructor = subType
    }
    
    inheritPrototype(Child, Parent)
    
    let child1 = new Child(‘child1’)
    child1.sayName()
    let child2 = new Child(‘child2’)
    child2.sayName()
    child1.staff.push(2)
    child1.showStaff()
    child2.showStaff()
    利益
    「JavaScript高級プログラム設計」表示:
    このような方式の高効率化は、一度だけPartent構造関数を呼び出し、従ってPartent.prototype上に不必要な、余分な属性を作成することを回避する.それと同時に、プロトタイプチェーンはまだ変わらないです.そのため、instance ofとisProttypeOfを正常に使うことができます.開発者は寄生結合式継承が引用型の最も理想的な継承モデルと考えられている.
    参考:https://github.com/mqyqingfeng/Blog/issues/16