首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在对象文本中使用`__proto__`

在对象文本中使用`__proto__`
EN

Stack Overflow用户
提问于 2020-08-08 10:46:12
回答 2查看 126关注 0票数 0

如果我没有弄错,使用Object.setPrototypeOf()__proto__更改对象原型被认为是“非常慢的操作”。而且,IIRC,这会降低V8中对象的性能。

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

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

  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

EN

回答 2

Stack Overflow用户

发布于 2020-08-08 13:04:01

不,不受欢迎,因为它不应该是语言的一部分(而是作为背景)。

另一方面,setPrototypeOf并没有受到反对,而仅仅因为其性能影响而被鄙视。然而,在新的对象上调用它并不是什么大问题,现在还没有什么可去优化的,新的原型将优化对象的使用。

然而,有一种更简单的方法:将Object.createObject.assign结合起来

代码语言:javascript
复制
Object.setPrototypeOf({…}, proto)

Object.assign(Object.create(proto), {…})
票数 1
EN

Stack Overflow用户

发布于 2020-08-08 11:05:24

"__proto__慢“是错误的信息。在内部,当您创建一个对象时,它具有[ prototype ]属性,该属性被设置为它的原型。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63314486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档