javascript - 类与函数返回对象

标签 javascript performance class es6-class

我注意到有两种不同的方法可以有效地用 JavaScript 编写类(或类似类的东西)。以一个简单的计数器类为例:

一个真正的类(用作new Counter1())

class Counter1 {
  constructor(count = 0) {
    this.count = count;
  }
  inc() {
    this.count++;
  }
  get() {
    return this.count;
  }
}

返回对象的函数(用作Counter2())

function Counter2(count = 0) {
  return {
    inc() {
      count++;
    },
    get() {
      return count;
    },
  };
}

我有很多代码可以用这些风格中的任何一种来编写。我应该使用哪个?

这是我的理解:

Counter1 可以与 instanceof 和继承一起使用,但更冗长并且没有真正的私有(private)属性(例如 count 属性是暴露)。

Counter2 更简洁,具有真正的私有(private)方法/状态(只是函数中的局部变量),但不能与 instanceof 和继承一起使用。它还会为每个实例创建 incget 函数的新副本,这可能会影响性能?我不知道。

最佳答案

我把它放在这里的 jsperf 页面中,以测试两种样式中创建新实例的速度:https://jsperf.com/class-vs-object-2

这是我计算机上的结果(每秒创建的新实例):

Test                    Chrome           Firefox           Edge
new Counter1();    217,901,688     2,086,800,399     31,106,382
Counter2();         30,495,508        36,113,817      9,232,171

我不知道为什么带有 class 的 Firefox 编号如此之高(希望它没有注意到代码无效并省略了整个内容)或者为什么 Edge 编号如此之低.

所以至少在性能方面,真正的类要快得多,可能是因为它避免了为每个实例创建方法的新副本的开销。

虽然类的冗长和缺乏私有(private)状态很烦人,但我认为性能优势更重要,但这取决于具体情况。

编辑

我也对生成的对象进行了测试调用 inc()get(),数字基本相同:

Test                   Chrome          Firefox         Edge
new Counter1();   215,352,342    2,072,278,834   23,570,036
Counter2();        14,309,836       35,564,201    9,801,748

关于javascript - 类与函数返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46751164/

相关文章:

c++ - 在 C++ 的派生类构造函数中从基模板类访问变量

c++ - 删除对象时常规函数和虚函数的行为

javascript - 如何让一张图片同时占据多个div

javascript - 如何从 Material-UI 将状态添加到函数

c# - C#中的慢速屏幕绘制

android - 性能:Android JCIFS 文件读取速度慢

javascript - 将 JQuery 用于 CSS 与样式表

javascript - AWS S3 访问仅有时被拒绝

ruby - 现代计算机的功能是否不足以处理字符串而无需使用符号(在 Ruby 中)

java - 编写我自己的包装器类并声明其元素数组