在javascript中,应该尽量避免new 操作符
2011-11-16 10:47
218 查看
Javascript是原型语言,但是他拥有new操作符,这使它看上去更像面向对象语言的类别,往往混淆程序员,从而导致一些有问题的编程模式的出现。
其实,在javascript中,你完全没有必要用newObject(),而应该采用对象字面量{}的方式进行声明。类似地,采用数组字面量[]的方式来代替newArray()对数组进行声明。Javascript中的数组内部运作机制不同于java中的数组,采用类似java的语法往往也会使学习javascript的人感到困惑。更进一步来讲,不要用newNumber,newString或者newBoolean进行声明变量,这些形式也会产生不必要的对象容器,请采用他们简单的字面量来代替。
根据以上的推论,对于函数的声明来讲,采用newFunction来创建函数值也是不理智的。而应该采用函数表达式的方式进行声明。例如:
frames[0].onfocus=newFunction("document.bgColor='antiquewhite'")
对于以上的声明方式,我们应该这样写:
两者相比较,后者可以被编译器更早地发现函数体,如果有任何语法错误就会在函数执行前被发现,而前者则是在javascript代码执行的时候才会逐行解析。概括地说,函数表达式的声明是发生在javascript预解析阶段,而采用newFunction的方式则发生在javascript执行的过程中。有时候,newFunction的声明方式会使采用它的人不懂得其函数内部代码是如何执行的。
同样地,如果我们构造一个包含绑定到私有变量与函数的方法,最好也要远离new前缀。
因为采用new来调用函数,对象会一直保持着无用的原型对象,毫无用处地占有内存空间。没有new调用function,我们就不会保留没有用处的原型链对象。所以,我们应该采用()来调用工厂模式下的函数。
规则很简单:我们采用new操作符的唯一情况就是调用自定义对象构造函数来创建对象的时候,这时候,new是强制采用的。
原文链接:http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/
初次翻译文章,语言显得呆板枯燥,不可避免地也会与原作者产生一些理解的差异,如有任何错误或疑问请指出,谢谢。
其实,在javascript中,你完全没有必要用newObject(),而应该采用对象字面量{}的方式进行声明。类似地,采用数组字面量[]的方式来代替newArray()对数组进行声明。Javascript中的数组内部运作机制不同于java中的数组,采用类似java的语法往往也会使学习javascript的人感到困惑。更进一步来讲,不要用newNumber,newString或者newBoolean进行声明变量,这些形式也会产生不必要的对象容器,请采用他们简单的字面量来代替。
根据以上的推论,对于函数的声明来讲,采用newFunction来创建函数值也是不理智的。而应该采用函数表达式的方式进行声明。例如:
frames[0].onfocus=newFunction("document.bgColor='antiquewhite'")
对于以上的声明方式,我们应该这样写:
frames[0].onfocus=function(){document.bgColor='antiquewhite';};
两者相比较,后者可以被编译器更早地发现函数体,如果有任何语法错误就会在函数执行前被发现,而前者则是在javascript代码执行的时候才会逐行解析。概括地说,函数表达式的声明是发生在javascript预解析阶段,而采用newFunction的方式则发生在javascript执行的过程中。有时候,newFunction的声明方式会使采用它的人不懂得其函数内部代码是如何执行的。
selObj.onchange=newFunction("dynamicOptionListObjects["+dol.index+"].change(this)");
无论我们以字符串的形式声明函数体(newFunction())还是以字符串表达式来声明函数体(函数表达式),javascript解析器都不会在预解析阶段发现函数体,这在迭代或循环过程中动态传递某些值是比较困难的。但是,如果我们来构造一个函数(例如采用闭包的形式)让其返回值也是一个函数,我们就可以明确地传递我们想要绑定的值。这允许我们用迭代的方式来初始化某个对象的属性集合。
selObj.onchange=function(i){
returnfunction(){
dynamicOptionListObjects[i].change(this);
};
}(dol.index);
把new直接放在function的前面也不是一个好主意,这在构造新对象不具有任何优势。
myObj=newfunction(){
this.type='core';
};
更好的方式是采用对象字面量,因为它简短、效率高。
myObj={
type:'core'
};
同样地,如果我们构造一个包含绑定到私有变量与函数的方法,最好也要远离new前缀。
varfoo=newfunction(){
functionprocessMessages(message){
alert("Message:"+message.content);
}
this.init=function(){
subscribe("/mytopic",this,processMessages);
}
}
因为采用new来调用函数,对象会一直保持着无用的原型对象,毫无用处地占有内存空间。没有new调用function,我们就不会保留没有用处的原型链对象。所以,我们应该采用()来调用工厂模式下的函数。
varfoo=function(){
functionprocessMessages(message){
alert("Message:"+message.content);
}
return{
init:function(){
subscribe("/mytopic",this,processMessages);
}
};
}();
规则很简单:我们采用new操作符的唯一情况就是调用自定义对象构造函数来创建对象的时候,这时候,new是强制采用的。
原文链接:
初次翻译文章,语言显得呆板枯燥,不可避免地也会与原作者产生一些理解的差异,如有任何错误或疑问请指出,谢谢。
相关文章推荐
- javascript中,new操作符的工作原理是什么?
- 【javascript】任何函数,只要通过new操作符来调用,那他就可以作为构造函数
- 浅谈javascript中new操作符的原理
- 【JavaScript】12种应该避免的js语法
- javascript 构造函数和new操作符
- ASP.NET : 为什么应该尽量避免直接用Response.Write输出内容
- 12种应该避免使用的Javascript语法
- 尽量避免诸如x.read(new FileInputStream(sourceFile)); 的写法
- javascript中new操作符
- 我应该尽量避免不幸
- 尽量避免诸如x.read(new FileInputStream(sourceFile)); 的写法
- 尽量避免诸如x.read(new FileInputStream(sourceFile)); 的写法
- ASP.NET : 为什么应该尽量避免直接用Response.Write输出内容
- javascript中应该避免不必要的重复
- 程序员为什么应该尽量避免争吵
- iOS里面尽量的避免两件事情的耦合性--ui刷新不应该和任何的事情耦合
- 底层设计应该尽量避免泛型
- 初学JavaScript之推測new操作符的原理
- 尽量避免诸如x.read(new FileInputStream(sourceFile)); 的写法
- [Effective JavaScript 笔记]第33条:使构造函数与new操作符无关