javascript - 重新分配原型时未覆盖链接对象的构造函数属性
问题描述
假设我有这个代码。
function Foo(){}
Foo.prototype.constructor === Foo; // true
var a = new Foo();
a.constructor === Foo; // true
所以基本上这里a.contructor
通过委托过程返回 Foo 并从Foo.prototype.constructor
.
行。现在,如果我将 Foo.prototype 重写为
function Foo(){}
Foo.prototype.constructor === Foo; // true
var a = new Foo();
Foo.prototype = {};
Foo.prototype.constructor === Foo; // false
a.constructor === Foo; // true;
最后两行不是消耗品。也不应该a.constructor
被修改并返回与 a 链接到 Foo.prototype 相同的值,Foo.prototype.constructor
并且 Javascript 不会创建副本,而是创建对象之间的链接(委托)
解决方案
Javascript 不创建副本,而是创建对象之间的链接(委托)
不是真的,它存储对对象的引用。现在在您的情况下Foo.prototype
并且a[[prototype]]
正在引用同一个对象,然后您进行更改Foo.prototype
但a[[prototype]]
仍然指向旧对象的引用。但是,如果您这样做:
Foo.prototype.constructor = null;
那么这两个比较都是错误的。或者你重写两个引用:
Foo.prototype = {};
Object.setPrototypeOf(a, Foo.prototype); // thats like a[[prototype]] = Foo.prototype