改变 __proto__:为什么性能会受到影响
JavaScript 中 proto 属性的文档强烈建议不要修改 [[对象的原型]],因为它对性能有不利影响。这是因为,与向 Function.prototype 添加属性相反,更改对象的原型对现代 JavaScript 实现具有深远的影响。
考虑以下示例:
<code class="javascript">function Foo(){} function bar(){} var foo = new Foo(); // This is bad: //foo.__proto__.bar = bar; // But this is okay Foo.prototype.bar = bar; // Both cause this to be true: console.log(foo.__proto__.bar == bar); // true</code>
虽然两种方法都会产生结果当 foo.__proto__.bar 设置为 bar 时,它们对性能的影响有很大不同。重新分配 Foo.prototype.bar 是可以接受的,但强烈建议不要直接更改 foo.__proto__.bar。
理解这种性能损失的关键在于 JavaScript 引擎采用的内部优化。当访问对象的属性时,引擎会根据类型和结构推断进行优化。然而,[[Prototype]] 的任何突变都会使这些优化失效,迫使引擎退回到较慢的非优化代码路径。
出现这种性能损失是因为更改对象的原型本质上交换了其内部类型,破坏预编译代码并刷新属性查找优化。因此,现代 JavaScript 实现中的后续执行不可避免地会变慢。
此外,值得注意的是,此类原型突变也可能导致类型混淆危险,使脚本行为的推理变得更具挑战性,并在 VM 和 中引入复杂性。 JIT 实施。因此,建议通过 Object.create() 创建具有不同原型链的新对象,而不是改变现有原型。
以上是为什么改变 __proto__ 会导致 JavaScript 性能下降?的详细内容。更多信息请关注PHP中文网其他相关文章!