小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

你真的會寫JavaScript嗎?

 Cogitate 2007-05-15

你真的會寫JavaScript嗎?

By 小馬 on UI探討

 

今天看到MSDN 上的新文章:Create Advanced Web Applications With Object-Oriented Techniques 。

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

同其他教你如何用面向?qū)ο蟮乃枷刖帉慗avaScript的其他文章一樣,該文也是著重在這么幾個要素:

  • JavaScript的對象就是一個關(guān)聯(lián)數(shù)組。
  • JavaScript 函數(shù)也是一個對象。
  • 原型(Prototype)
  • 閉包(Closures)
  • 繼承/私有屬性/靜態(tài)方法
  • 命名空間

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

特別是文章的開頭很有意思,作者寫到他和一個據(jù)說已經(jīng)寫了快4年JavaScript的女程序員聊天,女程序員認為她的JS水平very good,后來作者發(fā)現(xiàn)她確實會寫,但僅僅是會寫,其實對JavaScript的內(nèi)涵所知甚少。

作者想用這個例子說明,有很多具備Java/C++/C#的開發(fā)人員在編寫JavaScript或者轉(zhuǎn)行到FED(比如我)的時候,想當然的把那些標準面向?qū)ο笳Z言的思想套用在JavaScript上,反而走入迷途。

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

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


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

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

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

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

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

不要使用 new Function 去創(chuàng)建函數(shù)對象。用函數(shù)表達式更好。比如:

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

更好的寫法是:

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

第二種形式讓腳本編譯器更快的看到函數(shù)主體,于是其中的語法錯誤也會更快被檢測出來。有時候程序員使用 new Function 是因為他們沒有理解內(nèi)部函數(shù)是如何工作的。

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

如果我們讓用字符串做函數(shù)體,編譯器不能看到它們。 如果我們用字符串表達式做函數(shù)體,我們同樣也看不到它們。更好的方式就是不要盲目編程。通過制造一個返回值為函數(shù)的函數(shù)調(diào)用,我們可以明確的按值傳遞我們 想要綁定的值。這允許我們在循環(huán)中初始化一系列 selObj 對象。

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

    };
}(dol.index);

直接對一個函數(shù)使用new永遠不是一個好主意。比如, new function 對構(gòu)造新對象沒有提供什么優(yōu)勢。

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

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

myObj = {
    type: ‘core’
};

假如我們需要創(chuàng)建的對象包含的方法需要訪問私有變量或者函數(shù),更好的方式仍然是避免使用new.var foo = new function() {
    function processMessages(message) {
        alert(”Message: ” + message.content);
    }
    this.init = function() {
        subscribe(”/mytopic”, this, processMessages);
    }
}

通過使用 new 去調(diào)用函數(shù),對象會持有一個無意義的原型對象。這只會浪費內(nèi)存而不會帶來任何好處。如果我們不使用new,我們就不用在對象鏈維護一個無用的prototype對象。所以我們可以用()來正確的調(diào)用工廠函數(shù)。

var foo = function () {
    function processMessages(message) {
        alert(”Message: ” + message.content);
    }
    return {
        init: function () {
            subscribe(”/mytopic”, this, processMessages);
        }
    };
}();

所以原則很簡單: 唯一應該要用到new操作符的地方就是調(diào)用一個古老的構(gòu)造器函數(shù)的時候。當調(diào)用一個構(gòu)造器函數(shù)的時候,是強制要求使用new的。

有時候可以來new一下, 有的時候還是不要了吧。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多