鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ js繼承的最終形式是下面那種對嗎?

js繼承的最終形式是下面那種對嗎?

//組合繼承

  • 最終版本,互不干擾,屬性共享,方法共用,兩兩不交叉
  • 但是下面有個缺陷的地方是做了兩次構(gòu)建,導(dǎo)致如下的繼承關(guān)系。
//組合繼承
let log = a=>{console.log(a)}
function Person(){
    this.a = ["a"];
}
Person.prototype.b=["b"];
function Myth(){
    Person.call(this)
    this.c = ["c"];
}
Myth.prototype=new Person();
Myth.prototype.constructor=Myth;
Myth.prototype.d=["d"];
let myth1 = new Myth();
log(myth1);

圖片描述

還有一種 我認(rèn)為 這種才是最終版本~

//寄生組合繼承

  • 其實我這里簡化了寄生的過程 變成了賦值的操作 父子的構(gòu)造器屬性私有,原型共享,各自構(gòu)造器是本身 完美~
function Person(){
    this.a = ["a"];
}
Person.prototype.b=["b"];
function Myth(){
    Person.call(this)
    this.c = ["c"];
}
Myth.prototype=Person.prototype;
Myth.prototype.constructor=Myth;
Myth.prototype.d=["d"];
let myth1 = new Myth();
log(myth1);

圖片描述

你們覺得呢???

回答
編輯回答
孤星

這么寫你原型里的數(shù)組不是共用了么

    function Person() {
      this.a = ["a"];
    }
    Person.prototype.b = ["b"];

    function Myth() {
      Person.call(this)
      this.c = ["c"];
    }
    Myth.prototype = Person.prototype;
    Myth.prototype.constructor = Myth;
    Myth.prototype.d = ["d"];
    let myth1 = new Myth();
    let myth2 = new Myth();
    myth1.b.push("2");
    log(myth1);
    log(myth2);
    console.log(Person.prototype)

你改了子類的原型,父類原型都給改了.

2017年5月8日 16:07
編輯回答
蟲児飛

這跟直接繼承 new Person()有什么區(qū)別....

2017年10月21日 16:34