如果我没记错的话,使用
Object.setPrototypeOf()
和 __proto__
来更改对象原型被视为“非常慢的操作”,已被弃用。另外,IIRC,这会降低 V8 中对象的性能。
此外,通常不建议在创建后向对象添加属性,因为它也会降低 V8 中对象的性能(如果我正确理解了像this这样的解释)。
因此,如果我需要创建一个具有定义的原型和属性的对象,我有两个选择:
Object.create()
同时设置了原型和属性描述符参数。这个方法比较麻烦。
带有
__proto__
和属性的对象字面量。
那么问题是:这两个选项在性能方面是否相同?或者第二种方法只是内部相同延迟
Object.setPrototypeOf()
操作的语法糖?第二种方式有什么缺点吗?这些缺点是依赖于实现的还是常见的(依赖于规范?)?
UPD
另请参阅交叉帖子中的讨论:
https://github.com/nodejs/help/issues/2901
https://twitter.com/vsemozhetbyt/status/1292057058213269504
一个简单的基准:https://github.com/nodejs/help/issues/2901#issuecomment-671027781
“
__proto__
很慢”是错误的信息。在内部创建对象时,它具有设置为其原型的 [[Prototype]] 属性。
function Product(price,title){
this.Price = price;
this.Title = title;
}
Product.prototype.owner = "foo";
let p1 = new Product(10, "pen");
p1.__proto__ === Product.prototype; // true
因此,如果您想从另一个对象字面量创建对象,您只有两种选择:使用
Object.create
或手动设置 __proto__
。
另一种选择是使用构造函数,如我上面所示
在对象文字中使用
__proto__
没有任何缺点。
该语法是标准的,并针对实现进行了优化,与 Object.prototype 有很大不同。proto。
Object.prototype.__proto__
已弃用,但对象字面量中的 __proto__
并未弃用。对象字面量中的 __proto__
在 ES6 中成为标准,并且早在 ES5 就已经得到 Internet Explorer 等浏览器的支持。目前它是附件 B 的一部分,但它正在被移入主要规范。