如果我没有弄错的话,使用object.setPrototypeOf()
和__protote_
更改对象原型被认为是一种“非常慢的操作”。 同样,IIRC,这会降低V8中对象的性能。
另外,通常不建议在创建对象后向其添加属性,因为这也会降低V8中对象的性能(如果我理解正确的话)。
因此,如果我需要创建一个具有定义的原型和属性的对象,我有两个选项:
>
object.create()
,同时设置了原型和属性描述符参数。 这是相当麻烦的方式。
具有__protot_
和属性的对象文本。
所以问题是:这两种选择在性能上是平等的吗? 或者第二种方式只是在内部对相同的推迟的object.setPrototypeOf()
操作进行语法上的调整? 第二条路有什么缺点吗? 这些缺陷是依赖于实现的还是常见的(依赖于规范?)?
不,__proto__
是不推荐使用的,因为它不应该是语言的一部分(而是保留用于backcompat)。
另一方面,SetPrototypeOf
并不是不推荐使用,而仅仅是因为它对性能的影响而被鄙视。 然而,在新的对象上调用它并不是一个很大的问题,现在还没有什么需要去优化的,对象的使用将会在新的原型中得到优化。
但是,有一种更简单的方法:将对象。create
与对象。assign
:
Object.setPrototypeOf({…}, proto)
Object.assign(Object.create(proto), {…})
“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文字创建一个对象,您只有两个选择,要么使用object.create,要么手动设置proto。
另一种选择是使用构造函数,如我上面所示