JS 寄生組合繼承 《JS高級程序設計 第3版》P173頁是否可以表述得更好 財富值87?
從零學JS一周,看到《JS高級程序設計 第3版》中文版第173頁關于寄生組合繼承的地方,書中代碼為:
function object(o){function F(){}F.proto<愛尬聊_百科網>type = o;return new F();}function inheritPrototype(subType,superType) { var prototype=object(superType.prototype);//使prototype的[prototype]指向superType.prototype prototype.constuctor=subType; subType.property=prototype; } function SuperType(name) { this.name=name; this.Colors = ["red","blue","green"]; } SuperType.prototype.sayName=function (){ alert(this.name); }; function SubType(name, age){ SuperType.call(this,name); this.age = age; } inheritPrototype(SubType,SuperType);SubType.prototype.sayAge=function (){ alert(this.age); }然后給出插圖:
我的理解:
inheritPrototype(SubType,SuperType);這一行代碼使得SubType.prototype的[prototype]指向了SuperType.prototype,但SubType.prototype本身不是 SuperType的實例,不具備name,colors等屬性。
插圖這里調用了SubType.prototype=new SuperType();是否有點多此一舉。本來寄生組合繼承就是要實現SubType.prototype只繼承SuperTYpe.prototype。這樣一弄,相當于又回到組合繼承上去了。
我覺得書中這里可以表述得更好,比如把SubType.prototype=new SuperType();刪去,畫一個SubType.prototype沒有繼承SuperType實例屬性的圖。不知道這樣是不是正確的
lanzichun 2022-08-15 09:31
你說的對,仔細看書172頁,這插圖本來就是說的組合繼承,并不是寄生組合式繼承。