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

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

也不要用new Numbernew 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);


}


};

}();