来自 标准 setPrototypeOf
函数 以及非标准 __proto__
属性 的 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;
还不错。
更新 也许通过突变他们意味着重新分配。查看接受的答案。
原文由 basarat 发布,翻译遵循 CC BY-SA 4.0 许可协议
// Assign a new object to proto fred.proto = Object.prototype; // Or equally: Object.setPrototypeOf(fred, Object.prototype);
”`
Object.prototype
页面 上的警告更详细:他们只是说 改变一个已经存在的对象的原型链 会 _扼杀优化_。相反,您应该通过
Object.create()
创建一个具有不同原型链的新对象。我找不到明确的参考,但如果我们考虑 V8 的隐藏类 是如何实现的(以及 最近的 文章),我们可以看到这里可能发生的事情。当改变一个对象的原型链时,它的内部类型也会改变——它不像添加属性时那样简单地变成一个子类,而是完全交换。这意味着所有属性查找优化都被刷新,并且需要丢弃预编译代码。或者它只是退回到未优化的代码。
一些值得注意的引述: