{} 对象与自定义构造函数之间的隐藏 类 和等价性 (v8)

Hidden classes and equivalence between {} object vs. custom constructor (v8)

鉴于这篇文章:

http://richardartoul.github.io/jekyll/update/2015/04/26/hidden-classes.html

如果您创建一个构造函数,例如:

function Point(x,y) {
  this.x = x;
  this.y = y;
}

然后这样做:

var obj1 = new Point(1,2);
var obj2 = new Point(3,4);

obj1.a = 5;
obj1.b = 10;

obj2.b = 10;
obj2.a = 5;

意味着您在后台获得了某种性能优化。

不过我想知道,如果您只是这样做:

var obj1 = { a: 5, b: 10 }
var obj2 = { b: 10, a: 5 }

如果您对数千个对象遵循该模式,您是否会获得相同的性能优化,或者是否为每个 var objn 个实例创建一个新的隐藏 class。

基本上想知道是否需要使用构造函数来获得此性能优化。

正如文章摘要中所说:

Always instantiate your object properties in the same order so that hidden classes, and subsequently optimized code, can be shared.

在您的备选示例var obj1 = { a: 5, b: 10 }; var obj2 = { b: 10, a: 5 }中,属性显然没有按相同的顺序添加,因此无法共享隐藏的类。

您不必使用构造函数本身,但使用构造函数是确保获得所需性能的最简单方法。 (它通常也被认为是符合人体工程学和良好的编码习惯。)