提问者:小点点

在对象文本中使用`__protO__


如果我没有弄错的话,使用object.setPrototypeOf()__protote_更改对象原型被认为是一种“非常慢的操作”。 同样,IIRC,这会降低V8中对象的性能。

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

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

>

  • object.create(),同时设置了原型和属性描述符参数。 这是相当麻烦的方式。

    具有__protot_和属性的对象文本。

    所以问题是:这两种选择在性能上是平等的吗? 或者第二种方式只是在内部对相同的推迟的object.setPrototypeOf()操作进行语法上的调整? 第二条路有什么缺点吗? 这些缺陷是依赖于实现的还是常见的(依赖于规范?)?


  • 共2个答案

    匿名用户

    不,__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。

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