javascript prototype的深度探索不是原型繼承那么簡(jiǎn)單
更新時(shí)間:2008年06月02日 19:16:04 作者:
JavaScript中對(duì)象的prototype屬性,可以返回對(duì)象類型原型的引用。這是一個(gè)相當(dāng)拗口的解釋,要理解它,先要正確理解對(duì)象類型(Type)以及原型(prototype)的概念。
注意,以上的例子說(shuō)明了用prototype可以快速創(chuàng)建對(duì)象的多個(gè)副本,一般情況下,利用prototype來(lái)大量的創(chuàng)建復(fù)雜對(duì)象,要比用其他任何方法來(lái)copy對(duì)象快得多。注意到,用一個(gè)對(duì)象為原型,來(lái)創(chuàng)建大量的新對(duì)象,這正是prototype pattern的本質(zhì)。
下面是一個(gè)例子:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
除了上面所說(shuō)的這些使用技巧之外,prototype因?yàn)樗?dú)特的特性,還有其它一些用途,被用作最廣泛和最廣為人知的可能是用它來(lái)模擬繼承,關(guān)于這一點(diǎn),留待下一節(jié)中去討論。
3 prototype的實(shí)質(zhì)
上面已經(jīng)說(shuō)了prototype的作用,現(xiàn)在我們來(lái)透過(guò)規(guī)律揭示prototype的實(shí)質(zhì)。
我們說(shuō),prototype的行為類似于C++中的靜態(tài)域,將一個(gè)屬性添加為prototype的屬性,這個(gè)屬性將被該類型創(chuàng)建的所有實(shí)例所共享,但是這種共享是只讀的。在任何一個(gè)實(shí)例中只能夠用自己的同名屬性覆蓋這個(gè)屬性,而不能夠改變它。換句話說(shuō),對(duì)象在讀取某個(gè)屬性時(shí),總是先檢查自身域的屬性表,如果有這個(gè)屬性,則會(huì)返回這個(gè)屬性,否則就去讀取prototype域,返回protoype域上的屬性。另外,JavaScript允許protoype域引用任何類型的對(duì)象,因此,如果對(duì)protoype域的讀取依然沒(méi)有找到這個(gè)屬性,則JavaScript將遞歸地查找prototype域所指向?qū)ο蟮膒rototype域,直到這個(gè)對(duì)象的prototype域?yàn)樗旧砘蛘叱霈F(xiàn)循環(huán)為止,我們可以用下面的圖來(lái)描述prototype與對(duì)象實(shí)例之間的關(guān)系:
//TODO:
4 prototype的價(jià)值與局限性
從上面的分析我們理解了prototype,通過(guò)它能夠以一個(gè)對(duì)象為原型,安全地創(chuàng)建大量的實(shí)例,這就是prototype的真正含義,也是它的價(jià)值所在。后面我們會(huì)看到,利用prototype的這個(gè)特性,可以用來(lái)模擬對(duì)象的繼承,但是要知道,prototype用來(lái)模擬繼承盡管也是它的一個(gè)重要價(jià)值,但是絕對(duì)不是它的核心,換句話說(shuō),JavaScript之所以支持prototype,絕對(duì)不是僅僅用來(lái)實(shí)現(xiàn)它的對(duì)象繼承,即使沒(méi)有了prototype繼承,JavaScript的prototype機(jī)制依然是非常有用的。
由于prototype僅僅是以對(duì)象為原型給類型構(gòu)建副本,因此它也具有很大的局限性。首先,它在類型的prototype域上并不是表現(xiàn)為一種值拷貝,而是一種引用拷貝,這帶來(lái)了“副作用”。改變某個(gè)原型上引用類型的屬性的屬性值(又是一個(gè)相當(dāng)拗口的解釋:P),將會(huì)徹底影響到這個(gè)類型創(chuàng)建的每一個(gè)實(shí)例。有的時(shí)候這正是我們需要的(比如某一類所有對(duì)象的改變默認(rèn)值),但有的時(shí)候這也是我們所不希望的(比如在類繼承的時(shí)候),下面給出了一個(gè)例子:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
您可能感興趣的文章:
- Javascript中 關(guān)于prototype屬性實(shí)現(xiàn)繼承的原理圖
- JavaScript類和繼承 prototype屬性
- js中繼承的幾種用法總結(jié)(apply,call,prototype)
- 深入了解javascript中的prototype與繼承
- JavaScript面向?qū)ο笾甈rototypes和繼承
- Javascript 原型和繼承(Prototypes and Inheritance)
- JavaScript不使用prototype和new實(shí)現(xiàn)繼承機(jī)制
- JavaScript使用prototype原型實(shí)現(xiàn)的封裝繼承多態(tài)示例
- javascript基于prototype實(shí)現(xiàn)類似OOP繼承的方法
- Javascript中的prototype與繼承
- JS偽繼承prototype實(shí)現(xiàn)方法示例
- JavaScript使用prototype屬性實(shí)現(xiàn)繼承操作示例
相關(guān)文章
JavaScript數(shù)組every方法的應(yīng)用場(chǎng)景實(shí)例
every方法確定數(shù)組中的每一項(xiàng)的結(jié)果都滿足所寫(xiě)的條件的時(shí)候,就會(huì)返回true,否則返回false,這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組every方法應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2022-12-12JS實(shí)現(xiàn)跟隨鼠標(biāo)閃爍轉(zhuǎn)動(dòng)色塊的方法
這篇文章主要介紹了JS實(shí)現(xiàn)跟隨鼠標(biāo)閃爍轉(zhuǎn)動(dòng)色塊的方法,涉及javascript操作html元素及css樣式的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02如何清除IE10+ input X 文本框的叉叉和密碼輸入框的眼睛圖標(biāo)
從IE 10開(kāi)始,type=”text” 的 input 在用戶輸入內(nèi)容后,會(huì)自動(dòng)產(chǎn)生一個(gè)小叉叉(X),方便用戶點(diǎn)擊清除已經(jīng)輸入的文本,下面通過(guò)本文給大家介紹下如何清除IE10+ input X 文本框的叉叉和密碼輸入框的眼睛圖標(biāo)2016-12-12Js可拖拽放大的層拖動(dòng)特效實(shí)現(xiàn)方法
這篇文章主要介紹了Js可拖拽放大的層拖動(dòng)特效實(shí)現(xiàn)方法,涉及javascript操作DOM元素及css樣式的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02