不要滥用 new

By Douglas Crockford

 

 

 

javascript是一种原型语言,但是他有new操作符使得它又像是传统的面向对象语言,这种情况经常使得程序员疑惑,导致一些错误 的编程模式

你从来不需要使用 new Object() ,直接用{}就好了,不要使用 new Array() ,用 []代替,javascript里的数组和java里的差不多 ,用java模式的编程模式反而会使你疑惑的。

不要使用  new Number, new String, or 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.onchange = function (i) {

return function () {

dynamicOptionListObjects[i].change(this);

};

}(dol.index);
 



把 new 放在 function 的做法前面不好,例如new 在构造新对象时并没有什么优势:

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, 我们就不用在原型链上保存无用的原型对象。用工厂方法才是正确的做法:

var foo = function () {

function processMessages(message) {

alert(”Message: ” + message.content);

}

return {

init: function () {

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

}

};

}();
 



所以规则很简单,唯一正确使用new的时机是调用用于模拟类的构造函数的时候,当函数作为构造函数调用时, new是必须的。

总之:请在合适的时间,合适的地点使用 new 吧。

你可能感兴趣的:(JavaScript,编程,工作)