由淺到深了解JavaScript類(lèi)
更新時(shí)間:2007年01月11日 00:00:00 作者:
我們最近常談javascript的OO,但請(qǐng)大家要格外記住,javascript 不是“面向?qū)ο蟆钡恼Z(yǔ)言,最多只能說(shuō)是“基于對(duì)象”。
“面向?qū)ο蟆焙汀盎趯?duì)象”之間的差別,我一時(shí)很難找到 簡(jiǎn)單且又準(zhǔn)確 的詞匯來(lái)描述。
談到 “面向?qū)ο蟆?,我們首先可能?huì)想到 c++,其次是 java,后來(lái)再就是 dot net ,(其他的偏門(mén)語(yǔ)言我們這里不多討論)
其實(shí) c++ 在貫徹 “面向?qū)ο蟆彼枷敕矫?是不及 java 的,因?yàn)樗€存在大量 “過(guò)程”型的東西。 java 放棄了多重繼承,重載算子等“繁索不實(shí)用”的東西,把設(shè)計(jì)重點(diǎn)放在interface(接口)上,不僅簡(jiǎn)化的編程者的工作繁瑣度,而且讓整個(gè)框架看上去更加清晰。最重要的是 java 中所有的東西都是以類(lèi)的形式存在的,沒(méi)有第二種形式。至于后來(lái)dotnet 中的 c# ,看起來(lái)就像是 ms 牌子的 java.
扯遠(yuǎn)了,回到 javascript 上來(lái)
說(shuō)Javascript不是面向?qū)ο?不僅僅是 說(shuō) 它沒(méi)有真正意義上實(shí)現(xiàn):抽象對(duì)象、 繼承、重載等等面向?qū)ο蟮墓δ?BR>而是說(shuō) javascript中的“類(lèi)” 并不是真正廣義上“類(lèi)”的概念。類(lèi)原本是只是一個(gè)抽象定義,而javascript中通過(guò)“Function” 定義的類(lèi),本質(zhì)上卻是一個(gè)“對(duì)象”!
而且javascript的語(yǔ)法域并不是整個(gè) IE 進(jìn)程,而是以 Window對(duì)象為單位的。
不同Window對(duì)象下相同的Function定義,并不是同一個(gè)“類(lèi)”。
比如:
a.htm 中你定義了一個(gè) A 類(lèi) function A(){} , b.htm 中你也相同定義了這個(gè) A 類(lèi) function A(){}
在 a.htm 中你創(chuàng)建了一個(gè)實(shí)例: var a = new A();
你在 b.htm 中得到了 a.htm 的句柄 winAhandle
然后你得到 a.htm 中 a 實(shí)例的引用
var a = winAhandle.a;
你會(huì)發(fā)現(xiàn) a instanceof A 是 false,換成 a instanceof winAhandle.A 便是 true 了
原因很簡(jiǎn)單,b.htm 中的A 類(lèi)并不等同于 a.htm 中的A類(lèi),這種“類(lèi)”的語(yǔ)法域只限于 一個(gè)相同的 Window 對(duì)象下(同一個(gè)Window對(duì)象并不僅是指同一個(gè)頁(yè)面)
這顯然是有悖于 類(lèi)是一個(gè)廣義上的抽象定義 這種概念了
會(huì) VB 的人,也應(yīng)該了解:VB4之后,VB.NET之前的 VB(包括VBS)中的類(lèi),也是這種情況,雖然它是通過(guò) Class 的方式定義的。
比如你 new A 放到 session 里,下一次從 session 中取出來(lái),便不是原先那個(gè)對(duì)象了。
其實(shí)就是因?yàn)檎Z(yǔ)法域不同,前一次定義的類(lèi),并不能保留到這一次,解析器不知道他是什么東西,故不能還原了
順便提一下 javascript 中繼承方式是采用的 原型(prototype)繼承,詳細(xì)的介紹,大家可以去找這本書(shū)看看
《Design Patterns Elements of Reusable Object Oriented Soffware》
中文版好像叫 《可復(fù)用面向?qū)ο蟮脑O(shè)計(jì)模式》
一本好書(shū)?。?!
javascript中沒(méi)有多重繼承。多重繼承在面向?qū)ο笾胁⒉皇潜仨毜?。雖然多重繼承的重用性更好,但會(huì)導(dǎo)致類(lèi)之間的關(guān)系過(guò)于復(fù)雜。
一般來(lái)說(shuō),一樣事物,我們通??梢哉J(rèn)為它主要是某一類(lèi)事物的衍生物,單一繼承就夠用了,至于其他的特性,我們可以借助接口來(lái)定義。
javascript中也沒(méi)有接口概念,javascript不需要接口,因?yàn)樗且婚T(mén)解釋型的語(yǔ)言,不對(duì)實(shí)參的類(lèi)型做預(yù)校驗(yàn)。作為一個(gè)參數(shù)對(duì)象,有沒(méi)有某個(gè)方法,加載過(guò)程中并不去檢查,直到運(yùn)行時(shí),有則調(diào)用,無(wú)則異常。不需要強(qiáng)制性聲明繼承了哪個(gè)接口才能做為參數(shù)調(diào)用。
但實(shí)際中,我們還是需要設(shè)計(jì)一些接口,主要是出于view的考慮,整個(gè)框架容易被讀懂!
“面向?qū)ο蟆焙汀盎趯?duì)象”之間的差別,我一時(shí)很難找到 簡(jiǎn)單且又準(zhǔn)確 的詞匯來(lái)描述。
談到 “面向?qū)ο蟆?,我們首先可能?huì)想到 c++,其次是 java,后來(lái)再就是 dot net ,(其他的偏門(mén)語(yǔ)言我們這里不多討論)
其實(shí) c++ 在貫徹 “面向?qū)ο蟆彼枷敕矫?是不及 java 的,因?yàn)樗€存在大量 “過(guò)程”型的東西。 java 放棄了多重繼承,重載算子等“繁索不實(shí)用”的東西,把設(shè)計(jì)重點(diǎn)放在interface(接口)上,不僅簡(jiǎn)化的編程者的工作繁瑣度,而且讓整個(gè)框架看上去更加清晰。最重要的是 java 中所有的東西都是以類(lèi)的形式存在的,沒(méi)有第二種形式。至于后來(lái)dotnet 中的 c# ,看起來(lái)就像是 ms 牌子的 java.
扯遠(yuǎn)了,回到 javascript 上來(lái)
說(shuō)Javascript不是面向?qū)ο?不僅僅是 說(shuō) 它沒(méi)有真正意義上實(shí)現(xiàn):抽象對(duì)象、 繼承、重載等等面向?qū)ο蟮墓δ?BR>而是說(shuō) javascript中的“類(lèi)” 并不是真正廣義上“類(lèi)”的概念。類(lèi)原本是只是一個(gè)抽象定義,而javascript中通過(guò)“Function” 定義的類(lèi),本質(zhì)上卻是一個(gè)“對(duì)象”!
而且javascript的語(yǔ)法域并不是整個(gè) IE 進(jìn)程,而是以 Window對(duì)象為單位的。
不同Window對(duì)象下相同的Function定義,并不是同一個(gè)“類(lèi)”。
比如:
a.htm 中你定義了一個(gè) A 類(lèi) function A(){} , b.htm 中你也相同定義了這個(gè) A 類(lèi) function A(){}
在 a.htm 中你創(chuàng)建了一個(gè)實(shí)例: var a = new A();
你在 b.htm 中得到了 a.htm 的句柄 winAhandle
然后你得到 a.htm 中 a 實(shí)例的引用
var a = winAhandle.a;
你會(huì)發(fā)現(xiàn) a instanceof A 是 false,換成 a instanceof winAhandle.A 便是 true 了
原因很簡(jiǎn)單,b.htm 中的A 類(lèi)并不等同于 a.htm 中的A類(lèi),這種“類(lèi)”的語(yǔ)法域只限于 一個(gè)相同的 Window 對(duì)象下(同一個(gè)Window對(duì)象并不僅是指同一個(gè)頁(yè)面)
這顯然是有悖于 類(lèi)是一個(gè)廣義上的抽象定義 這種概念了
會(huì) VB 的人,也應(yīng)該了解:VB4之后,VB.NET之前的 VB(包括VBS)中的類(lèi),也是這種情況,雖然它是通過(guò) Class 的方式定義的。
比如你 new A 放到 session 里,下一次從 session 中取出來(lái),便不是原先那個(gè)對(duì)象了。
其實(shí)就是因?yàn)檎Z(yǔ)法域不同,前一次定義的類(lèi),并不能保留到這一次,解析器不知道他是什么東西,故不能還原了
順便提一下 javascript 中繼承方式是采用的 原型(prototype)繼承,詳細(xì)的介紹,大家可以去找這本書(shū)看看
《Design Patterns Elements of Reusable Object Oriented Soffware》
中文版好像叫 《可復(fù)用面向?qū)ο蟮脑O(shè)計(jì)模式》
一本好書(shū)?。?!
javascript中沒(méi)有多重繼承。多重繼承在面向?qū)ο笾胁⒉皇潜仨毜?。雖然多重繼承的重用性更好,但會(huì)導(dǎo)致類(lèi)之間的關(guān)系過(guò)于復(fù)雜。
一般來(lái)說(shuō),一樣事物,我們通??梢哉J(rèn)為它主要是某一類(lèi)事物的衍生物,單一繼承就夠用了,至于其他的特性,我們可以借助接口來(lái)定義。
javascript中也沒(méi)有接口概念,javascript不需要接口,因?yàn)樗且婚T(mén)解釋型的語(yǔ)言,不對(duì)實(shí)參的類(lèi)型做預(yù)校驗(yàn)。作為一個(gè)參數(shù)對(duì)象,有沒(méi)有某個(gè)方法,加載過(guò)程中并不去檢查,直到運(yùn)行時(shí),有則調(diào)用,無(wú)則異常。不需要強(qiáng)制性聲明繼承了哪個(gè)接口才能做為參數(shù)調(diào)用。
但實(shí)際中,我們還是需要設(shè)計(jì)一些接口,主要是出于view的考慮,整個(gè)框架容易被讀懂!
您可能感興趣的文章:
- 收集的幾個(gè)不錯(cuò)的javascript類(lèi)小例子
- 一個(gè)簡(jiǎn)單的javascript類(lèi)定義例子
- JavaScript類(lèi)和繼承 constructor屬性
- javascript 面向?qū)ο蟮腏avaScript類(lèi)
- javascript 圖片輪換 函數(shù)化繼承
- jquery下組織javascript代碼(js函數(shù)化)
- JavaScript類(lèi)和繼承 prototype屬性
- JavaScript類(lèi)和繼承 this屬性使用說(shuō)明
- javascript基礎(chǔ)知識(shí)分享之類(lèi)與函數(shù)化
相關(guān)文章
JS?簡(jiǎn)單實(shí)現(xiàn)拖拽評(píng)星的示例代碼
本文主要介紹了JS?簡(jiǎn)單實(shí)現(xiàn)拖拽評(píng)星,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05JavaScript設(shè)計(jì)模式之建造者模式實(shí)例教程
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之建造者模式,結(jié)合實(shí)例形式分析了設(shè)計(jì)模式中建造者模式的概念、功能及JavaScript實(shí)現(xiàn)與使用建造者模式的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07使用js實(shí)現(xiàn)的簡(jiǎn)單拖拽效果
本文給大家分享的是使用純JS實(shí)現(xiàn)的簡(jiǎn)單的拖拽效果的插件,算是對(duì)自己javascript學(xué)習(xí)的一個(gè)小的檢驗(yàn),如果小伙伴們需要復(fù)雜的拖拽效果,還是考慮jQuery的draggable吧,更成熟一些。2015-03-03JS無(wú)限級(jí)導(dǎo)航菜單實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于JS無(wú)限級(jí)導(dǎo)航菜單實(shí)現(xiàn)方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01javascript一個(gè)判斷瀏覽器類(lèi)型的函數(shù)(類(lèi))
javascript一個(gè)判斷瀏覽器類(lèi)型的函數(shù)(類(lèi))...2007-08-08