【问题标题】:Javascript overhead associated with Class versus object与类与对象相关的 Javascript 开销
【发布时间】:2011-10-04 00:16:45
【问题描述】:

我想知道与创建新类而不是该类的新对象相关的开销是小还是大。我正在使用 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?除非您要创建大量 Person2 对象,否则它的代码更多,灵活性更低,并且没有任何优势。

标签: javascript class overhead


【解决方案1】:

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

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

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

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

实际上,它不会产生任何实际差异,您应该编写代码封装的思想的最简洁表达方式。 (我个人认为每个名字都有不同的类是不寻常的......)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢测试,我以前从未见过 jsperf。对我来说,模块模式也是最慢的
    猜你喜欢
    • 2012-01-31
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多