我注意到有两种不同的方法可以有效地用 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
和继承一起使用。它还会为每个实例创建 inc
和 get
函数的新副本,这可能会影响性能?我不知道。
最佳答案
我把它放在这里的 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/