• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            [zz]JavaScript 的 new, 好久不見啊

            http://ued.taobao.com/blog/2007/05/15/%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BC%9A%E5%86%99javascript%E5%90%97%EF%BC%9F/
            --

            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一下, 有的時候還是不要了吧。

            posted on 2011-09-24 04:54 小默 閱讀(477) 評論(0)  編輯 收藏 引用 所屬分類: Language

            導航

            統計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            亚洲αv久久久噜噜噜噜噜| 国产精品99久久久久久董美香| 国产精品久久久久久久久久免费| 亚洲国产另类久久久精品| 一本久久a久久精品vr综合| 久久久亚洲AV波多野结衣| 麻豆AV一区二区三区久久| 无码人妻久久一区二区三区| 国产三级久久久精品麻豆三级 | 品成人欧美大片久久国产欧美...| 成人国内精品久久久久一区| 精品国产福利久久久| 手机看片久久高清国产日韩| 久久精品国产亚洲av影院| 超级碰久久免费公开视频| 久久综合亚洲色HEZYO国产| 久久精品人人槡人妻人人玩AV | 久久久久九国产精品| 欧美伊人久久大香线蕉综合69| 91精品国产9l久久久久| 久久99精品久久久久久动态图| 亚洲国产精品综合久久网络| 亚洲国产精品无码久久98| 国内精品久久久久影院一蜜桃| 人人狠狠综合久久88成人| 久久偷看各类wc女厕嘘嘘| 国产精品久久久久久一区二区三区| 国产精品久久久久久搜索| 久久se精品一区二区影院| 亚洲欧美成人综合久久久| 97久久精品人人做人人爽| 97精品依人久久久大香线蕉97| 办公室久久精品| 国产婷婷成人久久Av免费高清 | 激情五月综合综合久久69| 婷婷久久五月天| 久久婷婷五月综合97色一本一本 | 久久久久久综合网天天| 亚洲国产精品一区二区久久hs | 欧美黑人又粗又大久久久| 亚洲国产成人精品女人久久久|