摘要:二動(dòng)態(tài)原型模式動(dòng)態(tài)原型模式的特點(diǎn)是,在構(gòu)造函數(shù)里面增加判斷處理是否添加原型對(duì)象屬性。他依然有一個(gè)嚴(yán)重的問題,就是原型對(duì)象和實(shí)例和構(gòu)造函數(shù)之間沒辦法關(guān)聯(lián),這樣不適合在有一定規(guī)模復(fù)雜度的程序開發(fā)中使用。
續(xù)上一集內(nèi)容,有一些數(shù)據(jù)不需要共享的時(shí)候,但是又想實(shí)現(xiàn)共享數(shù)據(jù)處理,魚與熊掌,都要兼得(老板就是這么霸氣),那么經(jīng)過工程師們的智慧交流,他們發(fā)現(xiàn)現(xiàn)實(shí)并非那么殘酷,還有一些辦法可取的,也就是組合使用構(gòu)造函數(shù)模式和原型模式 和 動(dòng)態(tài)原型模式
一、組合使用構(gòu)造函數(shù)模式和原型模式組合使用構(gòu)造函數(shù)模式和原型模式的特點(diǎn)主要體現(xiàn)在:
構(gòu)造函數(shù)模式用于定義實(shí)例屬性
原型模式用于定義方法和共享屬性
效果就是,每個(gè)實(shí)例對(duì)象都會(huì)有自己的一份實(shí)例屬性,但又同時(shí)又共享著對(duì)方法的引用,既節(jié)省了資源也滿足了業(yè)務(wù)要求。
// 構(gòu)造函數(shù)用于定義實(shí)例屬性 function Food(name) { this.name = name; this.place = ["巴西", "印度"]; } // 原型模式用于定義方法和共享屬性 Food.prototype = { constructor: Food, sayName: function() { console.log("我是" + this.name); } }; var food1 = new Food("蘋果"); var food2 = new Food("蘋果"); console.log(food1.place == food2.place); // 返回 false food2.place.push("俄羅斯"); console.log(food1.place); // 返回 [ "巴西", "印度" ] console.log(food2.place); // 返回 [ "巴西", "印度", "俄羅斯" ]
可以看到 palce 數(shù)組并不是同一個(gè),并且通過對(duì) food2的 place 數(shù)組賦值之后也不會(huì)影響 food1的 palce 數(shù)組的值,證明他們是互相獨(dú)立的。
之所以有這么屌炸天的效果,就是因?yàn)槔昧藰?gòu)造函數(shù)和原型模式各自的特點(diǎn),互相補(bǔ)充。二、動(dòng)態(tài)原型模式
動(dòng)態(tài)原型模式的特點(diǎn)是,在構(gòu)造函數(shù)里面增加判斷處理是否添加原型對(duì)象屬性。
function Food(name, place) { this.name = name; this.place = place; if (typeof this.sayName !== "function") { Food.prototype.sayName = function() { console.log("我是" + this.name); }; } } var food1 = new Food("蘋果", ["巴西", "印度"]); food1.sayName(); // 返回 我是蘋果
通過在構(gòu)造函數(shù)執(zhí)行的時(shí)候來判斷是否將共享的東西添加到原型對(duì)象里面,這樣就不怕之前出現(xiàn)的先 new 實(shí)例化對(duì)象,然后再添加原型對(duì)象的屬性的問題了(回想一下原型對(duì)象被重寫之后,原型對(duì)象丟失,實(shí)例無法使用原來的原型對(duì)象的數(shù)據(jù)的問題)。
更符合 OOP 開發(fā)習(xí)慣,不需要將構(gòu)造函數(shù)和原型對(duì)象分開多帶帶處理,可以寫在一起。
動(dòng)態(tài)原型模式和組合使用構(gòu)造函數(shù)模式和原型模式的原理其實(shí)很類似,都是各自利用了構(gòu)造函數(shù)和原型模式的獨(dú)特的特點(diǎn)來實(shí)現(xiàn)的,不過在實(shí)現(xiàn)的過程中用了一些取巧,所以導(dǎo)致了他們的分別,細(xì)細(xì)回想一下就明白了。三、寄生構(gòu)造函數(shù)模式
這個(gè)只是了解一下即可,因?yàn)閷?shí)際中用得不多,但是需要擴(kuò)大知識(shí)面,無論從裝逼還是裝逼都還是需要的。
寄生這個(gè)詞其實(shí)不太好理解,英文原文是叫 parasitic 直接翻譯過來就是寄生了。如果硬要理解,就是創(chuàng)建的實(shí)例對(duì)象其實(shí)是依附上去的,跟構(gòu)造函數(shù)和原型對(duì)象本身并沒有任何關(guān)系,就好像寄生蟲和動(dòng)物,他們僅僅只是寄生在上面而已。
function Food(name) { var o = new Object(); o.name = name; o.sayName = function() { console.log("我是" + this.name); }; return o; // 重寫返回值 } var food1 = new Food("蘋果"); console.log(food1.name); // 返回 蘋果 food1.sayName(); // 返回 我是蘋果
這里跟工廠模式極其相似,但這里使用了 new 進(jìn)行實(shí)例化,換言之,也就是執(zhí)行了構(gòu)造函數(shù)來進(jìn)行實(shí)例化。
構(gòu)造函數(shù)在不返回值的情況下,默認(rèn)會(huì)返回新對(duì)象實(shí)例,而通過構(gòu)造函數(shù)的末尾添加一個(gè) return 語句,可以重寫這個(gè)返回值。
因?yàn)槊看味际?b>new Object(); ,而且構(gòu)造函數(shù)的返回值被重寫了,也就是說這個(gè)返回的新對(duì)象跟構(gòu)造函數(shù),跟原型對(duì)象是沒有關(guān)系的,他們同時(shí)具有工廠函數(shù)和構(gòu)造函數(shù)的缺點(diǎn)。
這里能夠訪問 name,因?yàn)檫@里的 name 屬性是暴露到返回的對(duì)象上面了,成為返回的對(duì)象的屬性,就跟 sayName 方法一樣,可以被外部訪問了。
他有一個(gè)嚴(yán)重的問題,就是原型對(duì)象和實(shí)例和構(gòu)造函數(shù)之間沒辦法關(guān)聯(lián),這樣不適合在有一定規(guī)模復(fù)雜度的程序開發(fā)中使用。(因?yàn)樗看味紩?huì)new Object(),重置原型對(duì)象的信息)四、穩(wěn)妥構(gòu)造函數(shù)模式
這個(gè)只是了解一下即可,因?yàn)閷?shí)際中我還沒用過,但是需要擴(kuò)大知識(shí)面,無論從裝逼還是裝逼都還是需要的。
所謂穩(wěn)妥對(duì)象,是指沒有公共屬性,而且其方法也不引用 this 對(duì)象,而且也不能被篡改,穩(wěn)得一逼。
function Food(name) { var o = new Object(); var color = "red"; o.sayName = function() { console.log("我是" + name); console.log("顏色是" + color); }; return o; } var food1 = Food("蘋果"); console.log(food1.name); // 返回 undefined console.log(food1.color); // 返回 undefined food1.sayName(); // 返回 我是蘋果,顏色是red
可以看到這里不使用this,也不使用 new 來實(shí)例化對(duì)象。
不能通過其他方式訪問 name 屬性,因?yàn)闆]有name 屬性沒有被暴露出來。
只能通過暴露出來的方法來訪問對(duì)象內(nèi)部的屬性,間接保護(hù)了內(nèi)部私有屬性。
穩(wěn)妥模式適合在一些安全環(huán)境(禁止使用 this,并且也需要保護(hù)私有屬性)里面使用。五、文末我們又遇到新問題了
他依然有一個(gè)嚴(yán)重的問題,就是原型對(duì)象和實(shí)例和構(gòu)造函數(shù)之間沒辦法關(guān)聯(lián),這樣不適合在有一定規(guī)模復(fù)雜度的程序開發(fā)中使用。(因?yàn)樗看味紩?huì)new Object(),重置原型對(duì)象的信息)
公司業(yè)務(wù)越來越大了,公司的產(chǎn)品需要做一些分類,例如動(dòng)物要分肉食動(dòng)物,菜食動(dòng)物,食物要分水果和蔬菜和肉類等,水果下面還要分蘋果,香蕉等等,要是按照現(xiàn)在的模式,看來是要有多少種就要寫多少種,然后還可能會(huì)導(dǎo)致一些種類屬性重復(fù),老司機(jī)一眼就看出來,需要做一些種類繼承了,但是要怎么做呢?
參考內(nèi)容紅寶書,javascript 高級(jí)程序設(shè)計(jì)第三版
淺談穩(wěn)妥構(gòu)造函數(shù)模式的實(shí)現(xiàn)原理與機(jī)制
版權(quán)信息作者: 慫如鼠
網(wǎng)站: https://www.whynotbetter.com
本作品著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97053.html
摘要:其實(shí)在之前的工廠模式里面,也存在這個(gè)問題,不過工廠模式更徹底,直接完全創(chuàng)建一個(gè)新對(duì)象,而構(gòu)造函數(shù)模式的話只是方法會(huì)被重新創(chuàng)建。 我來重新學(xué)習(xí) javascript 的面向?qū)ο螅╬art 1) 很多job 的描述都說要求精通 javascript 面向?qū)ο缶幊?,但是根?jù)一般的套路,寫精通其實(shí)就是熟練,寫熟練其實(shí)就是一般,寫一般其實(shí)就是懵逼! showImg(https://segment...
摘要:我是的可以改變函數(shù)的對(duì)象的指向拋出異常,沒有這個(gè)因?yàn)樽宇惡统惗际菢?gòu)造函數(shù),那么就會(huì)有之前說的,構(gòu)造函數(shù)在的時(shí)候,里面的方法函數(shù)會(huì)重復(fù)創(chuàng)建實(shí)例,導(dǎo)致資源浪費(fèi)。 我來重新學(xué)習(xí)js 的面向?qū)ο螅╬art 4) 續(xù)上一篇,隨著業(yè)務(wù)越來越大,要考慮一些繼承的玩意了,大千世界,各種東西我們要認(rèn)識(shí)和甄別是需要靠大智慧去分門別類,生物學(xué)中把動(dòng)植物按界、門、綱、目、科、屬、種進(jìn)行分類的方法可能是最有代...
摘要:先來說其實(shí)構(gòu)造函數(shù)也有,原型對(duì)象有,實(shí)例有也有,或者更加籠統(tǒng)的說,所有對(duì)象都是有的。構(gòu)造函數(shù)的原型對(duì)象上的會(huì)指向構(gòu)造函數(shù)。由于屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù),只是一個(gè)提示。 續(xù)上一集內(nèi)容,通過構(gòu)造函數(shù)的方式,成功地更新了生產(chǎn)技術(shù),老板笑呵呵,工人少奔波,只是問題總比辦法多,又遇到一個(gè)新問題,就是會(huì)造成一些資源的重復(fù)和浪費(fèi),那么經(jīng)過工程師們的智慧交流,他們產(chǎn)生了一個(gè)新技...
摘要:無限增殖返回蘋果返回香蕉返回返回使用的新語法方法會(huì)創(chuàng)建一個(gè)新對(duì)象,使用現(xiàn)有的對(duì)象來提供新創(chuàng)建的對(duì)象的。是新增的,用來規(guī)范原型式繼承。這里將返回的新對(duì)象放到子類的原型對(duì)象里面,這樣子類就擁有了父類的原型對(duì)象,也就實(shí)現(xiàn)了方法的繼承。 這是最后的最后了,我會(huì)順便總結(jié)一下各種繼承方式的學(xué)習(xí)和理解。(老板要求什么的,管他呢) 一、繼承-組合繼承、偽經(jīng)典繼承 showImg(https://seg...
摘要:請(qǐng)記住,這些書中的一些可能不是最新的,但概念和基礎(chǔ)仍應(yīng)適用。是最好的老師之一。的秘密由部分組成。在你完成這些書后,查看書籍和最好的本土?xí)? 我看過三本,第1本,第二本,第四本。第一本買的的實(shí)體書,其他兩本看的是電子書。第一本是大名鼎鼎老道寫的,書很薄,但是非常經(jīng)典。javascirpt忍者秘籍是jquery的作者寫的,也是非常經(jīng)典。you dont kown js系列也是非常好??戳?..
閱讀 1304·2021-10-08 10:04
閱讀 1936·2021-09-04 16:40
閱讀 2547·2019-08-30 13:21
閱讀 2291·2019-08-29 15:10
閱讀 2859·2019-08-29 12:35
閱讀 1199·2019-08-26 17:41
閱讀 3070·2019-08-26 17:03
閱讀 1150·2019-08-26 12:01