与Class对象相关的Javascript开销

时间:2011-07-12 21:11:06

标签: javascript class overhead

我想知道与创建新类而不是该类的新对象相关的开销是小还是大。我正在使用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();

编辑:人们想知道为什么我会选择这种方法。我正在实现一个模块化程序,用户根据需要创建和/或加载对象,而不是拥有一个Person / Shape / Text ...类,并使用50,000,000个参数(名称,年龄,性别,标签,字体, x,y,w,h ...)我想创建一个包含所有值的单个类。这也将简化编辑代码,因为我希望允许用户在浏览器中查看和修改代码。我不是OOP的新手,我确实意识到这与标准编程程序有所不同,所以对我知道自己在做什么有一点信心=)

2 个答案:

答案 0 :(得分:5)

不是真正的类(JS没有它们),但是你在第二个例子中得到的是另外两个构造函数。每个都必须有一个额外的prototype属性对象。

因此,就创建和存储的对象而言,您的第二种方法效率稍低。但是,如果你有很多Person1的实例,那么第二种方法可以通过将共享属性放在原型上而不是单独放在每个新实例上来节省(少量)空间:

function Person1() {}
Person1.prototype.name= 'Caine';

为每个Person1实例保存一个String实例。

实际上,它不会产生任何实际差异,你应该编写代码封装的最干净的表达方式。 (就我个人而言,每个名字都有不同的课程是不寻常的......)

答案 1 :(得分:1)

我编写了一个jsperf测试用例http://jsperf.com/class-vs-object-perf,用于演示4种方法,2使用您编写的案例,1使用返回对象的函数并可以调整为模块模式,最后使用原型。

在Chrome 14上,1,2,4之间的性能差异几乎相同。唯一一个慢的是类似于模块模式的那个。