在对象字面量中使用 `__proto__`

问题描述 投票:0回答:3

如果我没记错的话,使用

Object.setPrototypeOf()
__proto__
来更改对象原型被视为“非常慢的操作”,已被弃用。另外,IIRC,这会降低 V8 中对象的性能。

此外,通常不建议在创建后向对象添加属性,因为它也会降低 V8 中对象的性能(如果我正确理解了像this这样的解释)。

因此,如果我需要创建一个具有定义的原型和属性的对象,我有两个选择:

  1. Object.create()
    同时设置了原型和属性描述符参数。这个方法比较麻烦。

  2. 带有

    __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

javascript node.js object inheritance v8
3个回答
1
投票

不,

__proto__
已被弃用,因为它不应该成为语言的一部分(但保留用于向后兼容)。

另一方面,

setPrototypeOf
并未被弃用,而只是因为其性能影响而被鄙视。然而,在 fresh 对象上调用它并不是什么大问题,还没有什么可以取消优化的,并且对象的使用将根据新原型进行优化。

但是,还有一种更简单的方法:将

Object.create
Object.assign
结合起来:

Object.setPrototypeOf({…}, proto)

Object.assign(Object.create(proto), {…})

0
投票

__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__

另一种选择是使用构造函数,如我上面所示


0
投票

在对象文字中使用

__proto__
没有任何缺点。

来自MDN:

该语法是标准的,并针对实现进行了优化,与 Object.prototype 有很大不同。proto

Object.prototype.__proto__
已弃用,但对象字面量中的
__proto__
并未弃用。对象字面量中的
__proto__
在 ES6 中成为标准,并且早在 ES5 就已经得到 Internet Explorer 等浏览器的支持。目前它是附件 B 的一部分,但它正在被移入主要规范

© www.soinside.com 2019 - 2024. All rights reserved.