你真的會JavaScript嗎

來源:互聯網
上載者:User

很久沒有看到這樣讓人唇齒留香的好文了。上次看到的是一篇是 Douglas Crockford 的JavaScript, We Hardly new Ya (我簡單翻譯了一下,譯文在後)。

同其他教你如何用物件導向的思想編寫JavaScript的其他文章一樣,該文也是著重在這麼幾個要素:

  • JavaScript的對象就是一個關聯陣列。
  • JavaScript 函數也是一個對象。
  • 原型(Prototype)
  • 閉包(Closures)
  • 繼承/私人屬性/靜態方法
  • 命名空間

作者文筆很好,英文很容易看懂,沒有生僻的用詞(順便提一下,《PPK on JavaScript》作者的英文不敢恭維)。用來舉例的代碼也很貼切。

特別是文章的開頭很有意思,作者寫到他和一個據說已經寫了快4年JavaScript的女程式員聊天,女程式員認為她的JS水平very good,後來作者發現她確實會寫,但僅僅是會寫,其實對JavaScript的內涵所知甚少。

作者想用這個例子說明,有很多具備Java/C++/C#開發經驗的開發人員在編寫JavaScript或者轉行到FED(比如我)的時候,想當然的把那些標準物件導向語言的思想套用在JavaScript上,反而走入迷途。

對此我深有體會,我正是在真正參與了一次Ajax的項目並真正讀懂了Prototype架構的源碼之後,對JavaScript有了完全全新的認識。

總之,推薦閱讀。附上JavaScript, We Hardly new Ya的譯文,譯得匆忙,定有行文不通之處,請客官見諒!

JavaScript 的 new, 好久不見啊

原文: JavaScript, We Hardly new Ya  --Douglas Crockford。   

JavaScript是一門基於原型的語言,但它卻擁有一個 new 操作符使得其看起來象一門經典的面對對象語言。那樣也迷惑了程式員們,導致一些有問題的編程模式。

其實你永遠不需要在JavaScript使用 new Object()。用字面量的形式{}去取代吧。

同理,不要使用 new Array() ,而代之以字面量[]。JavaScript中的數組並不象Java中的數組那樣工作的,使用類似Java的文法只會讓你糊塗。

同理不用使用 new Number, new String, 或者 new Boolean。這些的用法只會產生無用的類型封裝對象。就直接使用簡單的字面量吧。

不要使用 new Function 去建立函數對象。用函數運算式更好。比如:

frames[0].onfocus = new Function(”document.bgColor=’antiquewhite’”)

更好的寫法是:

frames[0].onfocus = function () {document.bgColor = ‘antiquewhite’;};

第二種形式讓指令碼編譯器更快的看到函數主體,於是其中的語法錯誤也會更快被檢測出來。有時候程式員使用 new Function 是因為他們沒有理解內建函式是如何工作的。

selObj.onchange = new Function(”dynamicOptionListObjects[”+
        dol.index+”].change(this)”);

如果我們讓用字串做函數體,編譯器不能看到它們。如果我們用字串運算式做函數體,我們同樣也看不到它們。更好的方式就是不要盲目編程。通過製造一個傳回值為函數的函數調用,我們可以明確的按值傳遞我們想要綁定的值。這允許我們在迴圈中初始化一系列 selObj 對象。

selObj.onchange = function (i) {
    return function () {
        dynamicOptionListObjects[i].change(this);

    };
}(dol.index);

直接對一個函數使用new永遠不是一個好主意。比如, new function 對構造新對象沒有提供什麼優勢。

myObj = new function () {
    this.type = ‘core’;
};

更好的方式是使用對象字面量,它更輕巧,更快捷。

myObj = {
    type: ‘core’
};

假如我們需要建立的對象包含的方法需要訪問私人變數或者函數,更好的方式仍然是避免使用new.var foo = new function() {
    function processMessages(message) {
        alert(”Message: ” + message.content);
    }
    this.init = function() {
        subscribe(”/mytopic”, this, processMessages);
    }
}通過使用 new 去調用函數,對象會持有一個無意義的原型對象。這隻會浪費記憶體而不會帶來任何好處。如果我們不使用new,我們就不用在對象鏈維護一個無用的prototype對象。所以我們可以用()來正確的調用工廠函數。var foo = function () {
    function processMessages(message) {
        alert(”Message: ” + message.content);
    }
    return {
        init: function () {
            subscribe(”/mytopic”, this, processMessages);
        }
    };
}();所以原則很簡單: 唯一應該要用到new操作符的地方就是調用一個古老的構造器函數的時候。當調用一個構造器函數的時候,是強制要求使用new的。有時候可以來new一下, 有的時候還是不要了吧。

 

 

 

2 Responses to “你真的會寫JavaScript嗎?”Feed for this Entry
  1. 1 coocboy May 15th, 2007 at 11:16

    so fast

  2. 2 lenel May 15th, 2007 at 12:02 對於javaScript的Prototype我理解是一顆描述繼承樹的鏈子
    使用javaScript進行OO開發是完全可以的
    和java,C 等對比,有一點做不到:
    對於父類的成員方法(非構造方法)要麼完全重寫,要麼原封不動,也就是無法在子類的成員方法中調用父類的同名方法
    其他的重寫、重載、構造、介面、繼承、多態都是沒問題的
    當然指令碼語言沒有編譯器就無法進行比如做介面實現是否完整等檢查
    靠程式員自己控制好吧

 

來源:http://www.uiplanet.com/taobao/2007/05/15/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.