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