与类和对象相关的Javascript开销

与类和对象相关的Javascript开销,javascript,class,overhead,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');

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

编辑:人们想知道我为什么会采取这种方法。我正在实现一个模块化程序,用户可以根据需要创建和/或加载对象,而不是一个人/形状/文本。。。类并使用50000000个参数调用它名称、年龄、性别、标签、字体、x、y、w、h。。。我想创建一个包含所有值的类。这也将简化代码的编辑,因为我希望允许用户从浏览器中查看和修改代码。我对OOP并不陌生,我意识到这与标准编程过程不同,所以请相信我知道我在做什么=

不是真正的类,因为JS没有这些类,但在第二个示例中,您得到的是两个额外的构造函数。每个都必须有一个自己的原型属性对象

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

function Person1() {}
Person1.prototype.name= 'Caine';
每个Person1实例保存一个字符串实例


实际上,这不会产生任何实际的区别,您应该编写代码封装思想的最简洁的表达。就我个人而言,我认为每个名字都有不同的类是不寻常的…

不是真正的类,因为JS没有这些类,但在第二个示例中,您得到的是两个额外的构造函数。每个都必须有一个自己的原型属性对象

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

function Person1() {}
Person1.prototype.name= 'Caine';
每个Person1实例保存一个字符串实例


实际上,这不会产生任何实际的区别,您应该编写代码封装思想的最简洁的表达。就个人而言,我认为每个名字都有不同的类是不寻常的…

我编写了一个jsperf测试用例,演示了4种方法,2种使用您编写的用例,1种使用返回对象并可以调整为模块模式的函数,最后一种使用原型


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

我编写了一个jsperf测试用例,以演示4种方法,2种使用您编写的案例,1种使用返回对象并可调整为模块模式的函数,最后一种使用原型


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

为什么要做案例2?它更多的代码,更少的灵活性,并且没有我能看到的优势,除非你打算制作很多Person2对象。为什么有人会做案例2?它的代码较多,灵活性较低,并且没有任何优势,除非你打算制作大量Person2对象,否则我看不到。感谢测试,我以前从未见过jsperf。对我来说,模块模式也是最慢的。谢谢你的测试,我以前从未见过jsperf。对我来说,模块模式也是最慢的