JavaScript本是一种基于原形的(prototypal)语言,但它的“new”操作符看起来有点像经典语言。这迷惑了广大程序员们,并导致了很多使用上的问题。

在JavaScript中,不要用到new Object()这种操作,该用{ }来代替。同理,也不要用new Array(),相应的,用[]来代替。JavaScript的Array绝不同于Java的Array,模仿Java的语法只会使人越来越糊涂。

也不要用new Number,new String,或是new Boolean。在JavaScript使用包装对象完全没有必要,只需使用普通的声明就可以了。

不要用new Function来新建一个function,而应当用最普通的function表达式。例如:

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

更好的写法是:

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

同样定义一个事件,第二句不会立即检测函数体,哪怕是函数体有错,也不会立即报错。只有不了解function内部机制的人才会用new Function这种声明方式。

selObj.onchange = new Function(”dynamicOptionListObjects["

dol.index "].change(this)”);

如果我们直接写出函数体,编译器是无法看到其内部的(也就无法立即执行、无法立即引发错误)。但如果我们用表达式方式声明函数(如上),看不到函数内部的则是我们。编程的话,还是尽量对一且都尽量清晰可见吧。以声明函数的方式来返回一个函数,我们可以更加明确地传值,如下代码,它还可以设定一个初始值。

selObj.onchange = function (i) {

return function () {

dynamicOptionListObjects.change(this);

};
}(dol.index);

还有一个不好的习惯是将new放到function的前面,比如,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来执行此方法,这个对象会挂在一个没有意义的prototype上,它只会浪费内存。如果我们不用new,就不会浪费prototype对象于prototype链,所以,更佳的方案是使用()。如下所示:

var foo = function () {

function processMessages(message) {

alert(”Message: ” message.content);

}

return {

init: function () {

subscribe(”/mytopic”, this, processMessages);

}

};
}();

译后总结:由于以前对yui并不了解直接就用了ext,对js的不少地方也一知半解,直到看了这篇frank所给的文章才对new操作符略知一二。
给我的感觉就是:尽量不要显示地用new操作符,因为new这个东西在编译期就已经对对象进行初始化了,不用new的话运行期才进行初始化检查。(实际上我的用词不准确,在js中都是编译期,或都是运行期)。这样可以节省内存,且有利于调试,亦便于理解。
Ext的源码中用到了很多上面所提及的写法,如果以前不很明白,看完篇文章之后会有种豁然开朗的感觉。

对“prototype链”不太明白的可以参考这篇 http://www.javaeye.com/topic/53537

 posted on 2009-06-19 16:55 落叶满长沙 阅读(...) 评论(...) 编辑 收藏