首页  >  文章  >  web前端  >  为什么改变 __proto__ 会导致 JavaScript 性能下降?

为什么改变 __proto__ 会导致 JavaScript 性能下降?

Patricia Arquette
Patricia Arquette原创
2024-11-02 10:14:30608浏览

Why Does Mutating __proto__ Result in Performance Degradation in JavaScript?

改变 __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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn