Javascript setPrototypeOf对新对象的性能有什么影响?

Javascript setPrototypeOf对新对象的性能有什么影响?,javascript,ecmascript-6,Javascript,Ecmascript 6,MDN提示使用.setPrototypeOf()将对代码的未来性能产生不良影响 我还阅读了一些关于为什么更改对象的[[Prototype]]会降低性能的问题。但没有一个答案能真正解释背景中发生了什么。所以我想知道这是否也适用于新对象 我特别喜欢这样做: var MyPrototype = { method1 : function(){...}, method2 : function(){...}, ... }; var newObject = Object.setPro

MDN提示使用
.setPrototypeOf()
将对代码的未来性能产生不良影响

我还阅读了一些关于为什么更改对象的[[Prototype]]会降低性能的问题。但没有一个答案能真正解释背景中发生了什么。所以我想知道这是否也适用于新对象

我特别喜欢这样做:

var MyPrototype = {
    method1 : function(){...},
    method2 : function(){...},
    ...
};

var newObject = Object.setPrototypeOf({
    property : 1,
    property2 : 'text'                 
}, MyPrototype);
不幸的是,您不能对
对象执行此操作。创建
,因为它不接受普通对象文本

我使用的
setPrototypeOf
是否也会降低正在执行的JS引擎的性能?

如果您担心(显然您应该……)使用
Object.setPrototypeOf()
会对性能造成影响,但希望保持对象创建语法与代码的结构类似,请尝试以下方法:

var MyPrototype = {
    method1 : function(){...},
    method2 : function(){...},
    ...
};

var newObject = Object.assign(Object.create(MyPrototype), {
    property : 1,
    property2 : 'text'                 
});

另一种选择是将对象文字与
myPrototype
的浅拷贝合并,尽管这可能不是您想要的

var MyPrototype = {
    method1 : function(){},
    method2 : function(){}
};

var newObject = Object.assign({
    property : 1,
    property2 : 'text'                 
}, MyPrototype);

var newObject=Object.create(MyPrototype,{“property1”:{value:1},“property2”:{value:'text'});我知道,但我认为大多数情况下
对象.create()
属性对象太重。我宁愿只写通常的对象文字。如果没有使用
value
属性的附加子对象,您可以避免很多复杂性。您熟悉吗?我完全同意,Object.create()在添加道具时太混乱了,特别是当您为每个道具定义可写、可枚举等时。我真的很想使用Object.create(),但现在决定将函数构造函数模式与
new
一起使用,这要简单得多。标记的答案并不能真正回答问题,只是在
setPrototypeOf()
确实(或将)对性能产生巨大负面影响的情况下提供了一个解决方案。但没有任何迹象表明它确实会对性能产生负面影响。FirefoxJavaScript控制台也给出了同样的警告。为什么?哦,我明白了。嗯,好像我错过了这个。看起来有点傻,因为我们首先创建了两个新对象,一个具有所需属性但原型错误,另一个没有任何属性但原型正确。然后将所有属性从一个对象复制到另一个对象。但由于这将避免未来的性能问题,我想这是一个好办法。谢谢创建一个具有正确原型的对象,以及另一个要从中复制特性的对象。只有第二个值是“浪费的”,但这就是通常将多个“命名”值传递给函数的方式<代码>对象。创建
使用相同的机制是的,我知道。我的意思是,我们想要创建一个具有特定原型的新对象,但为了实现这一点,我们实际上需要创建两个。我也将此方法用于方法参数,但在这里,我们只想使用正确的原型快速设置一个新对象。但是这是更好的方法,所以没有抱怨^ ^如果你使用的是巴别塔,你也可以考虑使用<代码>