【发布时间】:2014-07-11 13:10:13
【问题描述】:
来自标准 setPrototypeOf function 以及非标准 __proto__ property 的 MDN 文档:
强烈建议不要改变对象的 [[Prototype]],无论是如何实现的,因为它非常缓慢,并且不可避免地会减慢现代 JavaScript 实现中的后续执行。
使用Function.prototype 添加属性是向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
为什么foo.__proto__.bar = bar; 不好?如果它的坏不是Foo.prototype.bar = bar; 一样坏吗?
那么为什么会出现这个警告:它非常慢,并且不可避免地会减慢现代 JavaScript 实现中的后续执行。 Foo.prototype.bar = bar; 肯定没那么糟糕。
更新也许他们所说的突变意味着重新分配。请参阅已接受的答案。
【问题讨论】:
-
__proto__是一个 deprecated 非标准属性 .. 所以顺便说一句,很高兴看到直接解决性能问题的答案:为什么“..在现代 JavaScript 实现中非常缓慢且不可避免地会减慢后续执行”? -
@user2864740 谢谢。那是我的意图。通过提及新的 standard 方式更新了问题以更加明确。
-
@basarat 我想他们都有同样的问题。似乎 JS 引擎需要为所有链接(派生)对象“刷新”任何缓存的属性解析或其他编译/中间 IL。
-
@basarat 也许吧。虽然我不同意这个答案,因为它似乎避开了与显式突变相关的任何问题(如图所示,没有
__proto__的人可以突变)并暗示没有发生这样的优化(这会对性能产生任何影响)。突变不存在)。 -
我找到了我正在寻找的问题和相应的答案:Should I put default values of attributes on the prototype to save space? 虽然不完全相关,但我认为这是您不应该这样做的原因之一。
标签: javascript performance prototype prototype-chain