首页 > 解决方案 > 重新分配原型时未覆盖链接对象的构造函数属性

问题描述

假设我有这个代码。

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

解决方案


Javascript 不创建副本,而是创建对象之间的链接(委托)

不是真的,它存储对对象的引用。现在在您的情况下Foo.prototype并且a[[prototype]]正在引用同一个对象,然后您进行更改Foo.prototypea[[prototype]]仍然指向旧对象的引用。但是,如果您这样做:

 Foo.prototype.constructor = null;

那么这两个比较都是错误的。或者你重写两个引用:

 Foo.prototype = {};
 Object.setPrototypeOf(a, Foo.prototype); // thats like a[[prototype]] = Foo.prototype

推荐阅读