我想知道创建一个新类而不是这个类的新对象的开销是大还是小。我正在使用dojo,但我将提供纯JS的对比示例。我将在启动时创建10到100个对象,我不认为这将是一个严重的问题,但我想涵盖所有的基础。
案例1:Javascript对象
function Person(name){
this.name = name;
}
var p1 = new Person('Caine');
var p2 = new Person('Seth');
var p3 = new Person('Abel');
对比案例2:Javascript类
function Person1(){
this.name = 'Caine';
}
function Person2(){
this.name = 'Seth';
}
function Person3(){
this.name = 'Abel';
}
var p1 = new Person1();
var p2 = new Person2();
var p3 = new Person3();
EDIT:人们想知道为什么我要采取这种方法。我正在实现一个模块化的程序,其中用户创建和/或加载所需的对象,而不是有一个人/形状/文本…类,然后用50,000,000个参数调用它(name, age, sex, label, font, x, y, w, h…)我想创建一个包含所有值的类。这也将简化编辑代码,因为我希望允许用户从浏览器内查看和修改代码。我对OOP并不陌生,我确实意识到这是对标准编程过程的背离,所以请相信我知道我在做什么=)
不是真正的类(JS没有),但是在第二个例子中您得到的是两个额外的构造函数。每个都必须有自己的附加prototype
属性对象。
因此,就创建和存储对象而言,第二种方法的效率略低。但是,如果您有很多Person1
实例,第二种方法可以通过将共享属性放在原型上而不是单独放在每个新实例上来节省(少量)空间:
function Person1() {}
Person1.prototype.name= 'Caine';
每个Person1实例保存一个String实例。
在现实中,它不会有任何实际的区别,你应该写最干净的表达你的代码封装的想法。(就我个人而言,我认为每个名字都有不同的类是不寻常的…)
我编写了一个jsperf测试用例http://jsperf.com/class-vs-object-perf,以演示4种方法,其中2种使用您编写的用例,1种使用返回对象的函数,可以将其改编为模块模式,最后一种使用原型。
在Chrome 14上,1、2、4之间的性能差异几乎相同。唯一慢的是与模块模式类似的模式。