背景
JavaScript 语言提供了两种操作方法对象的prototype属性:标准的setPrototypeOf函数和非标准的__proto__属性。但是,强烈建议不要使用这些方法之一来改变对象的原型。
性能影响
根据 MDN 文档,改变原型会显着减慢速度降低现代 JavaScript 实现中的后续执行。这是因为该过程涉及更改对象的类型,这会使先前优化的代码无效并强制解释器取消优化。这个去优化过程会对性能产生重大影响。
变异方法的比较
foo.__proto__.bar = bar 和 Foo.prototype.bar = bar create Object.getPrototypeOf(foo) 对象上的 bar 属性。但是,设置 __proto__ 属性本身(如 fred.__proto__ = Object.prototype 或 Object.setPrototypeOf(fred, Object.prototype))会引发性能下降。
根本原因
更改现有对象的原型链会破坏 JavaScript 引擎采用的内部类型优化。引擎必须丢弃以前编译的代码并回退到未优化的代码,从而导致性能损失。
专家意见
各种专家都表达了对可变原型的担忧:
替代方案
而不是突变现有对象的原型,建议使用 Object.create() 创建具有不同原型链的新对象。这种方法保留了优化并避免了与原型突变相关的性能损失。
以上是为什么改变对象原型会导致 JavaScript 性能下降?的详细内容。更多信息请关注PHP中文网其他相关文章!