關於js繼承的想法筆記

mazhenxiao發表於2019-02-19

教程中論述繼承

1、 舊方式

  function animal(){}
  animal.prototype = { 
        getname(){ } 
  }
  function cat(){}
  cat.prototype = new animal();
複製程式碼

2、新方式

    function animal(){}
  animal.prototype = { 
        getname(){ } 
  }
  function cat(){}
  cat.prototype = Object.create(new animal());
複製程式碼

但是隻能繼承一次,如果要是多繼承呢?我的想法是使用Object.assign,但是assign無法執行深複製!如果使用getOwnPropertyDescriptors配合Object.assign可以實現多繼承

function arm (){this.name="arm"}; arm.prototype={ getname(){}} 
function leg (){this.name="leg"}; arm.prototype={setname(){}}
let base = {}
Object.assign(
    //在原型獲取其屬性解構
    {...Object.getOwnPropertyDescriptors(arm).prototype.value},
    {...Object.getOwnPropertyDescriptors(leg).prototype.value},
    //利用Object.getOwnPropertyDescriptors無法獲取例項的__proto__的特性獲取建構函式內this指向引數
    {...Object.getOwnPropertyDescriptors(new arm())}, 
    {...Object.getOwnPropertyDescriptors(new leg())}
)
//繼承
function newFun(){}
newFun.prototype = base;
new newFun();//
複製程式碼

這種多重的繼承最大的問題是出現重複函式名會被覆蓋,而且如果做好多重繼承應該給出錯誤提示阻止其繼承,

相關文章