當(dāng)前位置:
首頁(yè) >
前端技术
> javascript
>内容正文
javascript
JavaScript的Prototype实现
生活随笔
收集整理的這篇文章主要介紹了
JavaScript的Prototype实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者:Jeff.Yan(閻宏),BlueSwing.Liu(劉如鴻)
模式: Prototype(原始模型模式或者原型模式)?????????????????? 定義: 通過(guò)給出一個(gè)原型對(duì)象來(lái)指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用這個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象,原始模型模式屬于對(duì)象的創(chuàng)建模式 JavaScript實(shí)現(xiàn): 在Java語(yǔ)言中對(duì)象都繼承自java.lang.Object,而java.lang.Object就提供了Clone的方法,只要實(shí)現(xiàn)接口Cloneable,即表示支持Clone,否則拋出異常。在這點(diǎn)JavaScript是非常接近的,所有的對(duì)象都是從Object繼承,不過(guò)Object并不支持Clone的方法,但是我們可以通過(guò)自己對(duì)于JavaScript通過(guò)expanddo的形式實(shí)現(xiàn)Clone方法,這樣日后所有的對(duì)象創(chuàng)建都實(shí)現(xiàn)了Clone方法。 因?yàn)镴avaScript本身沒(méi)有提供Clone的方法,同時(shí)對(duì)于對(duì)象的賦值如var a=new Object();var b=a,這樣的代碼a,b是指向同一對(duì)象的,要?jiǎng)?chuàng)建一個(gè)對(duì)象必須通過(guò)new 這個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn),因此在Clone的實(shí)現(xiàn)過(guò)程,我內(nèi)部定義了一個(gè)構(gòu)造子(constructor)CloneModel,同時(shí)指定其父對(duì)象為要進(jìn)行Clone活動(dòng)本身的對(duì)象,因此使用了this關(guān)鍵字,在我們定義的構(gòu)造子CloneModel的基礎(chǔ)上我們創(chuàng)建一個(gè)一個(gè)對(duì)象,因?yàn)闃?gòu)造子內(nèi)部沒(méi)有任何代碼,新創(chuàng)建的對(duì)象實(shí)際上說(shuō)所有的實(shí)現(xiàn)都在父對(duì)象中,也就是我們需要進(jìn)行Clone的對(duì)象。到目前為止,我們已經(jīng)創(chuàng)建了一個(gè)需要復(fù)制的對(duì)象,但是所有的值都是指向父對(duì)象的。 在 JavaScript的面向?qū)ο蠓绞街?,我們?cè)?jīng)討論過(guò),如果沒(méi)有覆蓋父對(duì)象的值,那么這個(gè)時(shí)候是直接指向父對(duì)象的,在Prototype Pattern是要求Clone之后的對(duì)象的內(nèi)部值是不應(yīng)該相關(guān)的,而只要賦值一次,objClone的值都會(huì)在自己的內(nèi)存空間里頭,而不是還指向父對(duì)象。基于如此的考慮,objClone[v]=objClone[v];語(yǔ)句就是實(shí)現(xiàn)將父對(duì)象的值通過(guò)覆蓋的方式拷貝到自己的內(nèi)存來(lái)。(這里提及的內(nèi)存應(yīng)該是邏輯意義上的) ? 深復(fù)制的實(shí)現(xiàn) 在完成上述工作之后,只是實(shí)現(xiàn)了淺復(fù)制,對(duì)象方面依然是指向?qū)ο蟮囊?#xff0c;這個(gè)時(shí)候可以通過(guò)調(diào)用指向?qū)ο蟮腃lone方法得到cloned對(duì)象的屬性對(duì)象(因?yàn)椴恢廊绾握f(shuō)了)。objClone[v]=objClone[v].Clone(); 這句代碼就是完成如此的功能。
Clone方法的實(shí)現(xiàn) 對(duì)象類的定義
測(cè)試代碼
結(jié)束語(yǔ): 按照我目前的理解和測(cè)試,我覺(jué)得prototype關(guān)鍵字不是prototype模式的實(shí)現(xiàn),這點(diǎn)通過(guò)parent object可以得到驗(yàn)證。
模式: Prototype(原始模型模式或者原型模式)?????????????????? 定義: 通過(guò)給出一個(gè)原型對(duì)象來(lái)指明所要?jiǎng)?chuàng)建的對(duì)象的類型,然后用這個(gè)原型對(duì)象的方法創(chuàng)建出更多同類型的對(duì)象,原始模型模式屬于對(duì)象的創(chuàng)建模式 JavaScript實(shí)現(xiàn): 在Java語(yǔ)言中對(duì)象都繼承自java.lang.Object,而java.lang.Object就提供了Clone的方法,只要實(shí)現(xiàn)接口Cloneable,即表示支持Clone,否則拋出異常。在這點(diǎn)JavaScript是非常接近的,所有的對(duì)象都是從Object繼承,不過(guò)Object并不支持Clone的方法,但是我們可以通過(guò)自己對(duì)于JavaScript通過(guò)expanddo的形式實(shí)現(xiàn)Clone方法,這樣日后所有的對(duì)象創(chuàng)建都實(shí)現(xiàn)了Clone方法。 因?yàn)镴avaScript本身沒(méi)有提供Clone的方法,同時(shí)對(duì)于對(duì)象的賦值如var a=new Object();var b=a,這樣的代碼a,b是指向同一對(duì)象的,要?jiǎng)?chuàng)建一個(gè)對(duì)象必須通過(guò)new 這個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn),因此在Clone的實(shí)現(xiàn)過(guò)程,我內(nèi)部定義了一個(gè)構(gòu)造子(constructor)CloneModel,同時(shí)指定其父對(duì)象為要進(jìn)行Clone活動(dòng)本身的對(duì)象,因此使用了this關(guān)鍵字,在我們定義的構(gòu)造子CloneModel的基礎(chǔ)上我們創(chuàng)建一個(gè)一個(gè)對(duì)象,因?yàn)闃?gòu)造子內(nèi)部沒(méi)有任何代碼,新創(chuàng)建的對(duì)象實(shí)際上說(shuō)所有的實(shí)現(xiàn)都在父對(duì)象中,也就是我們需要進(jìn)行Clone的對(duì)象。到目前為止,我們已經(jīng)創(chuàng)建了一個(gè)需要復(fù)制的對(duì)象,但是所有的值都是指向父對(duì)象的。 在 JavaScript的面向?qū)ο蠓绞街?,我們?cè)?jīng)討論過(guò),如果沒(méi)有覆蓋父對(duì)象的值,那么這個(gè)時(shí)候是直接指向父對(duì)象的,在Prototype Pattern是要求Clone之后的對(duì)象的內(nèi)部值是不應(yīng)該相關(guān)的,而只要賦值一次,objClone的值都會(huì)在自己的內(nèi)存空間里頭,而不是還指向父對(duì)象。基于如此的考慮,objClone[v]=objClone[v];語(yǔ)句就是實(shí)現(xiàn)將父對(duì)象的值通過(guò)覆蓋的方式拷貝到自己的內(nèi)存來(lái)。(這里提及的內(nèi)存應(yīng)該是邏輯意義上的) ? 深復(fù)制的實(shí)現(xiàn) 在完成上述工作之后,只是實(shí)現(xiàn)了淺復(fù)制,對(duì)象方面依然是指向?qū)ο蟮囊?#xff0c;這個(gè)時(shí)候可以通過(guò)調(diào)用指向?qū)ο蟮腃lone方法得到cloned對(duì)象的屬性對(duì)象(因?yàn)椴恢廊绾握f(shuō)了)。objClone[v]=objClone[v].Clone(); 這句代碼就是完成如此的功能。
Clone方法的實(shí)現(xiàn) 對(duì)象類的定義
測(cè)試代碼
結(jié)束語(yǔ): 按照我目前的理解和測(cè)試,我覺(jué)得prototype關(guān)鍵字不是prototype模式的實(shí)現(xiàn),這點(diǎn)通過(guò)parent object可以得到驗(yàn)證。
轉(zhuǎn)載于:https://www.cnblogs.com/coolcat/archive/2005/10/18/257138.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript的Prototype实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 生成和部署 XP Embedded 映像
- 下一篇: 为啥总让我“先去博客园其他网站逛逛”?