JavaScript 的 new, 好久不见[译/小马]
文章的开头很有意思,作者写到他和一个据说已经写了快4年JavaScript的女程序员聊天,女程序员认为她的JS水平very good,后来作者发现她确实会写,但仅仅是会写,其实对JavaScript的内涵所知甚少。
作者想用这个例子说明,有很多具备Java/C++/C#开发经验的开发人员在编写JavaScript或者转行到FED(比如我)的时候,想当然的把那些标准面向对象语言的思想套用在JavaScript上,反而走入迷途。
原文: 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一下, 有的时候还是不要了吧。
 

我有三言两语要评论:

如果需要您输入验证码,而您又看不清楚时,请点击发言区域右上角的“匿名式发表”以刷新验证码

发送引用通告网址: http://www.45eggs.com/cgi-bin/mt-tb.cgi/18
如果您想引用这篇日记到您的Blog,请复制上面的链接,放置到您发表文章时的相应界面中。

Ethan Jiang

人不能没有一种对某种不可摧毁的东西保持持久信念的生活……

Gmail

MSN QQ

吃吃喝喝是因那贪得无厌;说说灌灌只为了笑逐颜开。

October 2008
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Recent Entry
Ethan Jiang 尚能饭焉
Live Traffic Feed
45eggs Blog Feed