摘要:例如假如定義第二個(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è)空間
如果在上述的繼承方式中存在一個(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
摘要:下面來(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)的一種繼承模式。其背后的思路是使用原型鏈...
摘要:高程第六章繼承理解與實(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)知吧. 讀 首先是從中讀到了什么,我...
摘要:高程讀書(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í),描述了屬性的各種特征...
摘要:由構(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)造繼承、原型繼承、組合繼承、寄生組合繼承)...
摘要:對(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...
閱讀 3081·2021-11-24 11:14
閱讀 3525·2021-11-22 15:22
閱讀 3215·2021-09-27 13:36
閱讀 725·2021-08-31 14:29
閱讀 1335·2019-08-30 15:55
閱讀 1768·2019-08-29 17:29
閱讀 1153·2019-08-29 16:24
閱讀 2417·2019-08-26 13:48