由淺到深了解JavaScript類
更新時間:2007年01月11日 00:00:00 作者:
我們最近常談javascript的OO,但請大家要格外記住,javascript 不是“面向對象”的語言,最多只能說是“基于對象”。
“面向對象”和“基于對象”之間的差別,我一時很難找到 簡單且又準確 的詞匯來描述。
談到 “面向對象”,我們首先可能會想到 c++,其次是 java,后來再就是 dot net ,(其他的偏門語言我們這里不多討論)
其實 c++ 在貫徹 “面向對象”思想方面 是不及 java 的,因為它還存在大量 “過程”型的東西。 java 放棄了多重繼承,重載算子等“繁索不實用”的東西,把設計重點放在interface(接口)上,不僅簡化的編程者的工作繁瑣度,而且讓整個框架看上去更加清晰。最重要的是 java 中所有的東西都是以類的形式存在的,沒有第二種形式。至于后來dotnet 中的 c# ,看起來就像是 ms 牌子的 java.
扯遠了,回到 javascript 上來
說Javascript不是面向對象 不僅僅是 說 它沒有真正意義上實現(xiàn):抽象對象、 繼承、重載等等面向對象的功能
而是說 javascript中的“類” 并不是真正廣義上“類”的概念。類原本是只是一個抽象定義,而javascript中通過“Function” 定義的類,本質上卻是一個“對象”!
而且javascript的語法域并不是整個 IE 進程,而是以 Window對象為單位的。
不同Window對象下相同的Function定義,并不是同一個“類”。
比如:
a.htm 中你定義了一個 A 類 function A(){} , b.htm 中你也相同定義了這個 A 類 function A(){}
在 a.htm 中你創(chuàng)建了一個實例: var a = new A();
你在 b.htm 中得到了 a.htm 的句柄 winAhandle
然后你得到 a.htm 中 a 實例的引用
var a = winAhandle.a;
你會發(fā)現(xiàn) a instanceof A 是 false,換成 a instanceof winAhandle.A 便是 true 了
原因很簡單,b.htm 中的A 類并不等同于 a.htm 中的A類,這種“類”的語法域只限于 一個相同的 Window 對象下(同一個Window對象并不僅是指同一個頁面)
這顯然是有悖于 類是一個廣義上的抽象定義 這種概念了
會 VB 的人,也應該了解:VB4之后,VB.NET之前的 VB(包括VBS)中的類,也是這種情況,雖然它是通過 Class 的方式定義的。
比如你 new A 放到 session 里,下一次從 session 中取出來,便不是原先那個對象了。
其實就是因為語法域不同,前一次定義的類,并不能保留到這一次,解析器不知道他是什么東西,故不能還原了
順便提一下 javascript 中繼承方式是采用的 原型(prototype)繼承,詳細的介紹,大家可以去找這本書看看
《Design Patterns Elements of Reusable Object Oriented Soffware》
中文版好像叫 《可復用面向對象的設計模式》
一本好書?。?!
javascript中沒有多重繼承。多重繼承在面向對象中并不是必須的。雖然多重繼承的重用性更好,但會導致類之間的關系過于復雜。
一般來說,一樣事物,我們通??梢哉J為它主要是某一類事物的衍生物,單一繼承就夠用了,至于其他的特性,我們可以借助接口來定義。
javascript中也沒有接口概念,javascript不需要接口,因為它是一門解釋型的語言,不對實參的類型做預校驗。作為一個參數(shù)對象,有沒有某個方法,加載過程中并不去檢查,直到運行時,有則調(diào)用,無則異常。不需要強制性聲明繼承了哪個接口才能做為參數(shù)調(diào)用。
但實際中,我們還是需要設計一些接口,主要是出于view的考慮,整個框架容易被讀懂!
“面向對象”和“基于對象”之間的差別,我一時很難找到 簡單且又準確 的詞匯來描述。
談到 “面向對象”,我們首先可能會想到 c++,其次是 java,后來再就是 dot net ,(其他的偏門語言我們這里不多討論)
其實 c++ 在貫徹 “面向對象”思想方面 是不及 java 的,因為它還存在大量 “過程”型的東西。 java 放棄了多重繼承,重載算子等“繁索不實用”的東西,把設計重點放在interface(接口)上,不僅簡化的編程者的工作繁瑣度,而且讓整個框架看上去更加清晰。最重要的是 java 中所有的東西都是以類的形式存在的,沒有第二種形式。至于后來dotnet 中的 c# ,看起來就像是 ms 牌子的 java.
扯遠了,回到 javascript 上來
說Javascript不是面向對象 不僅僅是 說 它沒有真正意義上實現(xiàn):抽象對象、 繼承、重載等等面向對象的功能
而是說 javascript中的“類” 并不是真正廣義上“類”的概念。類原本是只是一個抽象定義,而javascript中通過“Function” 定義的類,本質上卻是一個“對象”!
而且javascript的語法域并不是整個 IE 進程,而是以 Window對象為單位的。
不同Window對象下相同的Function定義,并不是同一個“類”。
比如:
a.htm 中你定義了一個 A 類 function A(){} , b.htm 中你也相同定義了這個 A 類 function A(){}
在 a.htm 中你創(chuàng)建了一個實例: var a = new A();
你在 b.htm 中得到了 a.htm 的句柄 winAhandle
然后你得到 a.htm 中 a 實例的引用
var a = winAhandle.a;
你會發(fā)現(xiàn) a instanceof A 是 false,換成 a instanceof winAhandle.A 便是 true 了
原因很簡單,b.htm 中的A 類并不等同于 a.htm 中的A類,這種“類”的語法域只限于 一個相同的 Window 對象下(同一個Window對象并不僅是指同一個頁面)
這顯然是有悖于 類是一個廣義上的抽象定義 這種概念了
會 VB 的人,也應該了解:VB4之后,VB.NET之前的 VB(包括VBS)中的類,也是這種情況,雖然它是通過 Class 的方式定義的。
比如你 new A 放到 session 里,下一次從 session 中取出來,便不是原先那個對象了。
其實就是因為語法域不同,前一次定義的類,并不能保留到這一次,解析器不知道他是什么東西,故不能還原了
順便提一下 javascript 中繼承方式是采用的 原型(prototype)繼承,詳細的介紹,大家可以去找這本書看看
《Design Patterns Elements of Reusable Object Oriented Soffware》
中文版好像叫 《可復用面向對象的設計模式》
一本好書?。?!
javascript中沒有多重繼承。多重繼承在面向對象中并不是必須的。雖然多重繼承的重用性更好,但會導致類之間的關系過于復雜。
一般來說,一樣事物,我們通??梢哉J為它主要是某一類事物的衍生物,單一繼承就夠用了,至于其他的特性,我們可以借助接口來定義。
javascript中也沒有接口概念,javascript不需要接口,因為它是一門解釋型的語言,不對實參的類型做預校驗。作為一個參數(shù)對象,有沒有某個方法,加載過程中并不去檢查,直到運行時,有則調(diào)用,無則異常。不需要強制性聲明繼承了哪個接口才能做為參數(shù)調(diào)用。
但實際中,我們還是需要設計一些接口,主要是出于view的考慮,整個框架容易被讀懂!
相關文章
javascript一個判斷瀏覽器類型的函數(shù)(類)
javascript一個判斷瀏覽器類型的函數(shù)(類)...2007-08-08