根据 MDN 文档中的 标准 setPrototypeOf
函数 和非标准的__proto__
属性,无论是如何完成,改变对象的 [[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__
是一个已弃用的非标准属性..既然这个问题已经解决了,那么直接回答性能问题会更好:为什么在现代JavaScript实现中它会"..非常慢并且不可避免地减缓后续执行"? - user2864740__proto__
的情况下进行变异,如所示),并暗示没有发生任何这样的优化(这将使任何性能影响 wrt. 变异是不存在的)。 - user2864740