摘要:那你們肯定會(huì)問(wèn)為什么共用,而沒(méi)有共用呢,下面就給你解釋,請(qǐng)看引用類型是共用的值類型是私用的。
引言
繼承的方式面向?qū)ο蟮木幊陶Z(yǔ)言都具繼承這一機(jī)制,而 JavaScript 是基于原型(Prototype)面向?qū)ο蟪绦蛟O(shè)計(jì),所以它的實(shí)現(xiàn)方式也是基于原型(Prototype)實(shí)現(xiàn)的.
類式繼承
構(gòu)造函數(shù)繼承
組合繼承
原型式繼承
寄生式繼承
寄生組合式繼承
1.類式繼承//聲明父類 function SuperClass(){ //值類型 this.superValue = true; //引用類型 this.book = ["c","java","htnl"] } //為父類添加方法 SuperClass.prototype.getSuperValue =function(){ return this.superValue; } //聲明子類 function SubClass(){ this.subValue = false; } //繼承父類 SubClass.prototype = new SuperClass(); //為子類添加方法 SubClass.prototype.getSubValue = function(){ return this.subValue; } //測(cè)試 var a = new SubClass(); var b = new SubClass(); console.log(a.getSubValue()); //false console.log(a.getSuperValue()); //true console.log(a.book);//["c", "java", "htnl"] console.log(b.book);//["c", "java", "htnl"] a.book.push("css"); console.log(a.book);//["c", "java", "htnl", "css"] console.log(b.book);//["c", "java", "htnl", "css"] console.log(a.getSuperValue())//true console.log(b.getSuperValue())//true a.superValue = "a"; console.log(a.getSuperValue())//a console.log(b.getSuperValue())//true console.log(a.getSubValue())//false console.log(b.getSubValue())//false a.subValue = "sub"; console.log(a.getSubValue())//sub console.log(b.getSubValue())//false
通過(guò)測(cè)試可以得知類式繼承有如下特點(diǎn):
通過(guò)子類原型繼承父類的實(shí)例 實(shí)現(xiàn)繼承.
子類實(shí)例的原型都是父類實(shí)例,所以 a b 都是用的是 父類的實(shí)例.所以它的屬性共用(值類型,引用類型)。那你們肯定會(huì)問(wèn):為什么book 共用,而 subValue 沒(méi)有共用呢,下面就給你解釋,請(qǐng)看2
引用類型是共用的,值類型是私用的。
其實(shí):值類型按理說(shuō)應(yīng)該和值類型一樣,都是共用的,但是因?yàn)?this 的原因,this.superValue尋值時(shí)由近到遠(yuǎn),先尋找 a,若 a 沒(méi)有則尋找 a 的原型`prototype`,一直往上,若沒(méi)有則返回`"undefined"`,這樣你就知道為什么給a.book.push("css"); 之后 b.book 也發(fā)生了改變,因?yàn)樗菍ふ业皆蜕系?book 值,而a.superValue = "a"; 則直接給 a 添加了個(gè) superValue 屬性,而沒(méi)有去 原型`prototype`的superValue賦值,則輸出的時(shí)候也是就近.
下一節(jié)講解 面向?qū)ο蟮腏avaScript之繼承(二) 構(gòu)造函數(shù)繼承
參考個(gè)人博客
JavaScript 設(shè)計(jì)模式 --- 張容銘 著
注本人對(duì)類式繼承的一點(diǎn)點(diǎn)理解,若是那里解釋的有問(wèn)題,請(qǐng)多指教,謝謝!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/81570.html
摘要:是完全的面向?qū)ο笳Z(yǔ)言,它們通過(guò)類的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街?,?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來(lái)的。 JavaScript 函數(shù)式腳本語(yǔ)言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長(zhǎng)期以來(lái)人們對(duì)這一門語(yǔ)言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z(yǔ)言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽猓瑥膶?duì)語(yǔ)言感悟的角度闡述為什...
摘要:組合繼承前面兩種模式的特點(diǎn)類式繼承通過(guò)子類的原型對(duì)父類實(shí)例化實(shí)現(xiàn)的,構(gòu)造函數(shù)式繼承是通過(guò)在子類的構(gòu)造函數(shù)作用環(huán)境中執(zhí)行一次父類的構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的。 類有三部分 構(gòu)造函數(shù)內(nèi)的,供實(shí)例化對(duì)象復(fù)制用的 構(gòu)造函數(shù)外的,直接通過(guò)點(diǎn)語(yǔ)法添加的,供類使用,實(shí)例化對(duì)象訪問(wèn)不到 類的原型中的,實(shí)例化對(duì)象可以通過(guò)其原型鏈間接地訪問(wèn)到,也是供所有實(shí)例化對(duì)象所共用的。 類式繼承 類的原型對(duì)象的作用就是為類...
摘要:對(duì)象重新認(rèn)識(shí)面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計(jì)模式上看,對(duì)象是計(jì)算機(jī)抽象現(xiàn)實(shí)世界的一種方式。除了字面式聲明方式之外,允許通過(guò)構(gòu)造器創(chuàng)建對(duì)象。每個(gè)構(gòu)造器實(shí)際上是一個(gè)函數(shù)對(duì)象該函數(shù)對(duì)象含有一個(gè)屬性用于實(shí)現(xiàn)基于原型的繼承和共享屬性。 title: JS對(duì)象(1)重新認(rèn)識(shí)面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計(jì)模式上看,對(duì)象是...
摘要:子類不是父類實(shí)例的問(wèn)題是由類式繼承引起的。所以寄生式繼承和構(gòu)造函數(shù)繼承的組合又稱為一種新的繼承方式。但是這里的寄生式繼承處理的不是對(duì)象,而是類的原型??瓷先ヂ晕?fù)雜,還得好好研究。 寄生組合式繼承(終極繼承者) 前面學(xué)習(xí)了類式繼承和構(gòu)造函數(shù)繼承組合使用,也就是組合繼承,但是這種繼承方式有個(gè)問(wèn)題,就是子類不是父類的實(shí)例,而子類的原型是父類的實(shí)例。子類不是父類實(shí)例的問(wèn)題是由類式繼承引起的。...
摘要:的繼承方式屬于原型式繼承,非常靈活。當(dāng)使用關(guān)鍵字執(zhí)行類的構(gòu)造函數(shù)時(shí),系統(tǒng)首先創(chuàng)建一個(gè)新對(duì)象,這個(gè)對(duì)象會(huì)繼承自構(gòu)造函數(shù)的原型對(duì)象新對(duì)象的原型就是構(gòu)造函數(shù)的屬性。也就是說(shuō),構(gòu)造函數(shù)用來(lái)對(duì)生成的新對(duì)象進(jìn)行一些處理,使這個(gè)新對(duì)象具有某些特定的屬性。 繼承這個(gè)東西在Javascript中尤其復(fù)雜,我掌握得也不好,找工作面試的時(shí)候在這個(gè)問(wèn)題上栽過(guò)跟頭。Javascript的繼承方式屬于原型式繼承,...
閱讀 3774·2021-09-24 09:48
閱讀 1262·2021-09-10 10:51
閱讀 3446·2019-08-30 13:03
閱讀 3483·2019-08-30 12:51
閱讀 1530·2019-08-30 11:22
閱讀 1250·2019-08-29 18:38
閱讀 2208·2019-08-29 16:41
閱讀 3437·2019-08-29 15:32