成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

高程3版中《寄生組合式繼承》中的一個(gè)錯(cuò)誤

lufficc / 1511人閱讀

摘要:例如假如定義第二個(gè)子類(lèi)然后在第一個(gè)子類(lèi)中重新定義方法最后的輸出結(jié)果是由此可以看出,中的方法也發(fā)生了改變,如果將替換成方法,就不會(huì)存在這樣的問(wèn)題。

前言

最近一直在回顧js繼承方式,在閱讀《高級(jí)程序設(shè)計(jì)》第3版 的時(shí)候遇到一個(gè)問(wèn)題,下面僅個(gè)人看法,如果有理解錯(cuò)誤或者不同看法,歡迎一起探討:

正文

何謂寄生組合繼承,實(shí)質(zhì)上分為兩步:

將父類(lèi)的原型對(duì)象賦值給子類(lèi)的原型對(duì)象

將子類(lèi)原型對(duì)象中的constructor指針指向子類(lèi)構(gòu)造函數(shù)

這樣就實(shí)現(xiàn)了繼承,具體代碼如下所示(書(shū)中原代碼):

function SuperType(name){
    this.name = name;
}

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

function SubType(name, age){
    SuperType.call(this, name);
    this.age = age;
}

function inheritPrototype(subType, superType){
    const subPrototype =  Object(superType.prototype);
    subPrototype.constructor = SubType;
    subType.prototype = subPrototype;
}

inheritPrototype(SubType, SuperType);

SubType.prototype.sayAge = function(){
    console.log(this.age);
}

const sub_1 = new SubType("liumin", "23");

sub_1.sayName();
sub_1.sayAge();

在inheritPrototype函數(shù)當(dāng)中正是完成了上面的兩個(gè)步驟,但是注意這里是通過(guò)Object函數(shù)創(chuàng)建一個(gè)對(duì)象賦值給subPrototype的,接下來(lái)我們了解一下Object函數(shù)

Object函數(shù)

為給定值創(chuàng)建一個(gè)對(duì)象包裝器,如果傳入的是undefined 或者 null,則返回一個(gè)空對(duì)象;否則返回一個(gè)給定值對(duì)應(yīng)類(lèi)型的對(duì)象;

    console.log(Object(undefined));
    console.log(Object(null));
    console.log(Object("123"));
    console.log(Object(123));

輸出結(jié)果是:

如果傳入的參數(shù)是一個(gè)對(duì)象,那么通過(guò)Object返回的則是對(duì)這個(gè)對(duì)象的引用,如下所示:

const person = {
    name:"xiaohong",
    age:"23",
    grade:"12",
}

const anotherPerson = Object(person);
console.log(anotherPerson === person);

輸出結(jié)果:

person和anotherPerson引用的是同一塊內(nèi)存地址,這與Object.create(obj)是有差別的,Object.create(obj)是在內(nèi)存中新開(kāi)辟一個(gè)空間

存在的問(wèn)題

如果在上述的繼承方式中存在一個(gè)問(wèn)題,如果之后通過(guò)子類(lèi)的原型對(duì)象對(duì)父類(lèi)中的sayName方法進(jìn)行重新定義,這時(shí)候就會(huì)修改父類(lèi)中的sayName方法,從而繼承父類(lèi)的其他子類(lèi)中的sayName方法也就會(huì)被篡改掉,造成混亂。
例如:
假如定義第二個(gè)子類(lèi)——SubTypeCopy:

function SubTypeCopy(name, height){
    SuperType.call(this, name);
    this.height = height;
}
inheritPrototype(SubTypeCopy, SuperType);

然后在第一個(gè)子類(lèi)中重新定義sayName方法:

SubType.prototype.sayName = function(){
  console.log(`my name is:${this.name}`);
 }

const sub_1 = new SubType("liumin", "23");
const sub_2 = new SubTypeCopy("liujie","180");

sub_1.sayName();
sub_2.sayName();

最后的輸出結(jié)果是:

由此可以看出,SubTypeCopy中的sayName方法也發(fā)生了改變,如果將Object替換成Object.create(obj)方法,就不會(huì)存在這樣的問(wèn)題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94824.html

相關(guān)文章

  • JS高程筆記 - 繼承

    摘要:下面來(lái)看一個(gè)例子繼承屬性繼承方法在這個(gè)例子中構(gòu)造函數(shù)定義了兩個(gè)屬性和。組合繼承最大的問(wèn)題就是無(wú)論什么情況下都會(huì)調(diào)用兩次超類(lèi)型構(gòu)造函數(shù)一次是在創(chuàng)建子類(lèi)型原型的時(shí)候另一次是在子類(lèi)型構(gòu)造函數(shù)內(nèi)部。 組合繼承 組合繼承(combination inheritance),有時(shí)候也叫做偽經(jīng)典繼承,指的是將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長(zhǎng)的一種繼承模式。其背后的思路是使用原型鏈...

    fsmStudy 評(píng)論0 收藏0
  • JavaScript高程第六章:繼承-理解與實(shí)踐

    摘要:高程第六章繼承理解與實(shí)踐昨日細(xì)細(xì)的讀了一遍高程現(xiàn)在寫(xiě)篇文章來(lái)鞏固下認(rèn)知吧讀首先是從中讀到了什么我自己也在讀書(shū)的時(shí)候用筆記下了各個(gè)部分的點(diǎn)現(xiàn)在等于閱讀筆記回憶下書(shū)本理解基礎(chǔ)第五版中規(guī)定了兩種屬性數(shù)據(jù)屬性訪(fǎng)問(wèn)器屬性數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位 JavaScript高程第六章:繼承-理解與實(shí)踐昨日細(xì)細(xì)的讀了一遍JavaScript高程,現(xiàn)在寫(xiě)篇文章來(lái)鞏固下認(rèn)知吧. 讀 首先是從中讀到了什么,我...

    mozillazg 評(píng)論0 收藏0
  • JS高程讀書(shū)筆記--第六章原型繼承

    摘要:高程讀書(shū)筆記第六章理解對(duì)象創(chuàng)建自定義對(duì)象的方式有創(chuàng)建一個(gè)實(shí)例,然后為它添加屬性和方法。創(chuàng)建了自定義的構(gòu)造函數(shù)之后,其原型對(duì)象默認(rèn)只會(huì)取得屬性至于其他方法都是從繼承而來(lái)的。 JS高程讀書(shū)筆記--第六章 理解對(duì)象 創(chuàng)建自定義對(duì)象的方式有創(chuàng)建一個(gè)Object實(shí)例,然后為它添加屬性和方法。還可用創(chuàng)建對(duì)象字面量的方式 屬性類(lèi)型 ECMAScript在定義只有內(nèi)部采用的特性時(shí),描述了屬性的各種特征...

    EasonTyler 評(píng)論0 收藏0
  • 面向?qū)ο蟮男【啪?/b>

    摘要:由構(gòu)造函數(shù)返回的對(duì)象就是表達(dá)式的結(jié)果。如果構(gòu)造函數(shù)沒(méi)有顯式返回一個(gè)對(duì)象,則使用步驟創(chuàng)建的對(duì)象。運(yùn)算符返回一個(gè)布爾值,表示對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。 面向?qū)ο?本人能力有限,有誤請(qǐng)斧正 本文旨在復(fù)習(xí)面向?qū)ο?不包含es6) 本文學(xué)習(xí)思維 創(chuàng)建對(duì)象的方式,獲取對(duì)象屬性 構(gòu)造函數(shù),構(gòu)造函數(shù)的new 做了什么 原型與原型對(duì)象 原型鏈 繼承(借用構(gòu)造繼承、原型繼承、組合繼承、寄生組合繼承)...

    時(shí)飛 評(píng)論0 收藏0
  • 高程(第六章) 面向?qū)ο蟮某绦蛟O(shè)計(jì)

    摘要:對(duì)于采用這種模式的對(duì)象,還可以使用操作符確定它的類(lèi)型寄生構(gòu)造函數(shù)模式通常,在前述的幾種模式都不適用的情況下,可以使用寄生構(gòu)造函數(shù)模式。這個(gè)模式可以在特殊的情況下用來(lái)為對(duì)象創(chuàng)建構(gòu)造函數(shù)。 ECMA-262把對(duì)象定義為:無(wú)序?qū)傩缘募希鋵傩钥梢园局怠?duì)象或者函數(shù)。嚴(yán)格來(lái)講,這就相當(dāng)于說(shuō)對(duì)象是一組沒(méi)有特定順序的值。 1 理解對(duì)象 創(chuàng)建對(duì)象: var person = new Obje...

    ranwu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<