- JavaScript的對象就是一個(gè)關(guān)聯(lián)數組。
- JavaScript 函數也是一個(gè)對象。
- 原型(Prototype)
- 閉包(Closures)
- 繼承/私有屬性/靜態(tài)方法
- 命名空間
| 今天看到MSDN 上的新文章:Create Advanced Web Applications With Object-Oriented Techniques 。 很久沒(méi)有看到這樣讓人唇齒留香的好文了。上次看到的是一篇是 Douglas Crockford 的JavaScript, We Hardly new Ya (我簡(jiǎn)單翻譯了一下,譯文在后)。 同其他教你如何用面向對象的思想編寫(xiě)JavaScript的其他文章一樣,該文也是著(zhù)重在這么幾個(gè)要素:
作者文筆很好,英文很容易看懂,沒(méi)有生僻的用詞(順便提一下,《PPK on JavaScript》作者的英文不敢恭維)。用來(lái)舉例的代碼也很貼切。 特別是文章的開(kāi)頭很有意思,作者寫(xiě)到他和一個(gè)據說(shuō)已經(jīng)寫(xiě)了快4年JavaScript的女程序員聊天,女程序員認為她的JS水平very good,后來(lái)作者發(fā)現她確實(shí)會(huì )寫(xiě),但僅僅是會(huì )寫(xiě),其實(shí)對JavaScript的內涵所知甚少。 作者想用這個(gè)例子說(shuō)明,有很多具備Java/C++/C#的開(kāi)發(fā)人員在編寫(xiě)JavaScript或者轉行到FED(比如我)的時(shí)候,想當然的把那些標準面向對象語(yǔ)言的思想套用在JavaScript上,反而走入迷途。 對此我深有體會(huì ),我正是在真正參與了一次Ajax的項目并真正讀懂了Prototype框架的源碼之后,對JavaScript有了完全全新的認識。 總之,推薦閱讀。附上JavaScript, We Hardly new Ya的譯文,譯得匆忙,定有行文不通之處,請客官見(jiàn)諒! 原文: JavaScript, We Hardly new Ya --Douglas Crockford。 JavaScript是一門(mén)基于原型的語(yǔ)言,但它卻擁有一個(gè) new 操作符使得其看起來(lái)象一門(mén)經(jīng)典的面對對象語(yǔ)言。那樣也迷惑了程序員們,導致一些有問(wèn)題的編程模式。 其實(shí)你永遠不需要在JavaScript使用 new Object()。用字面量的形式{}去取代吧。 同理不用使用 new Number, new String, 或者 new Boolean。這些的用法只會(huì )產(chǎn)生無(wú)用的類(lèi)型封裝對象。就直接使用簡(jiǎn)單的字面量吧。 不要使用 new Function 去創(chuàng )建函數對象。用函數表達式更好。比如: frames[0].onfocus = new Function(”document.bgColor=’antiquewhite’”) 更好的寫(xiě)法是: frames[0].onfocus = function () {document.bgColor = ‘antiquewhite’;}; 第二種形式讓腳本編譯器更快的看到函數主體,于是其中的語(yǔ)法錯誤也會(huì )更快被檢測出來(lái)。有時(shí)候程序員使用 new Function 是因為他們沒(méi)有理解內部函數是如何工作的。 selObj.onchange = new Function(”dynamicOptionListObjects[”+ 如果我們讓用字符串做函數體,編譯器不能看到它們。 如果我們用字符串表達式做函數體,我們同樣也看不到它們。更好的方式就是不要盲目編程。通過(guò)制造一個(gè)返回值為函數的函數調用,我們可以明確的按值傳遞我們 想要綁定的值。這允許我們在循環(huán)中初始化一系列 selObj 對象。 selObj.onchange = function (i) { }; 直接對一個(gè)函數使用new永遠不是一個(gè)好主意。比如, new function 對構造新對象沒(méi)有提供什么優(yōu)勢。 myObj = new function () { 更好的方式是使用對象字面量,它更輕巧,更快捷。 myObj = { 假如我們需要創(chuàng )建的對象包含的方法需要訪(fǎng)問(wèn)私有變量或者函數,更好的方式仍然是避免使用new.var foo = new function() { 通過(guò)使用 new 去調用函數,對象會(huì )持有一個(gè)無(wú)意義的原型對象。這只會(huì )浪費內存而不會(huì )帶來(lái)任何好處。如果我們不使用new,我們就不用在對象鏈維護一個(gè)無(wú)用的prototype對象。所以我們可以用()來(lái)正確的調用工廠(chǎng)函數。 var foo = function () { 所以原則很簡(jiǎn)單: 唯一應該要用到new操作符的地方就是調用一個(gè)古老的構造器函數的時(shí)候。當調用一個(gè)構造器函數的時(shí)候,是強制要求使用new的。 有時(shí)候可以來(lái)new一下, 有的時(shí)候還是不要了吧。 |
聯(lián)系客服