修改对象的 [[Prototype]] 对性能的影响
标准 setPrototypeOf 方法和非标准 __proto__ 的 Mozilla 文档property 警告不要改变对象的 [[Prototype]],强调其对现代 JavaScript 实现中性能的不利影响。
但是,此警告不适用于像这样使用 Function.prototype 将成员函数添加到类中:
function Foo(){} function bar(){} var foo = new Foo(); Foo.prototype.bar = bar; console.log(foo.__proto__.bar == bar); // true
在此示例中,foo.__proto__.bar = bar 和 Foo.prototype.bar = bar 都达到相同的结果,而不会影响性能。
发生重新分配时会出现问题到 __proto__ 属性本身:
function Employee() {} var fred = new Employee(); fred.__proto__ = Object.prototype; // Or equally: Object.setPrototypeOf(fred, Object.prototype);
文档中的警告明确指出,修改现有对象的原型链会破坏现代 JavaScript 引擎执行的优化。它建议使用 Object.create() 创建具有所需原型链的新对象。
这种性能下降源于 V8 等 JavaScript 引擎中隐藏类的内部实现细节。当对象的原型链发生变化时,其内部类型会发生变化,从而使属性查找优化和编译代码失效。
JavaScript 社区的专家强调了与创建后允许原型突变相关的复杂性和错误风险,引用它对类型推断、代理和性能稳定性产生不利影响。
因此,虽然使用 Function.prototype 修改成员函数不会引起性能问题,但应避免重新分配对象的 __proto__ 属性,以防止优化损失。
以上是为什么修改对象的[[原型]]会影响性能?的详细内容。更多信息请关注PHP中文网其他相关文章!