想象一下,我们像这样定义一个新对象:
const foo = {number1: 1, number2: 2}
这应该使用这两个属性定义一个新的“隐藏类”。
现在假设我使用ES6类语法定义一个新类。
class Numbers {
constructor() {
this.number1 = 1
this.number2 = 2
}
}
然后我从中创建一个新对象。
const bar = new Numbers()
现在的问题是:bar
的“隐藏类”是否与foo
的隐藏类相同?
因为我想像的是,第一个定义将创建一个具有两个属性的新“隐藏类”,而第二个定义将创建一个新的“隐藏类”,然后将创建一个具有一个属性的新“隐藏类”然后使用另一个属性创建另一个“隐藏类”,将三个“隐藏类”链接在一起。
有人可以澄清吗? 如果我的假设是正确的,那么新的“ ES6类语法”确实会慢一些。
根据文章:JavaScript engine fundamentals: Shapes and Inline Caches · Mathias Bynens
答案 0 :(得分:4)
现在的问题是:栏的“隐藏类”是否与foo的“隐藏类”相同?
不。 foo
将创建一个这样的隐藏类(伪代码):
{ number1: Number, number2: Number }
但是bar
的构造将创建三个隐藏的类,首先是一个空的类:
{}
然后将分配第一个属性,并扩展现有的隐藏类:
{ number1: Number } -> {}
第二次分配后,它将再次扩展:
{ number2: Number } -> { number1: Number } -> {}
实际上,隐藏类不等于foo
的隐藏类,因为它被分成多个相互延伸的隐藏类。
如果我的假设是正确的,那么新的“ ES6类语法”确实会慢一些。
可能是。对象文字确实非常快,而类构造函数却要慢一些。实际上,它们甚至比常规功能慢,但是V8团队is working on it。但是,即使性能差异很小,在很多情况下您也可能不会注意到它。