链接对象的构造函数属性在重新分配原型时不会被覆盖

时间:2018-07-31 08:07:02

标签: 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)也不应该a.constructor也被修改并返回与Foo.prototype.constructor相同的值,因为a毕竟链接到Foo.prototype并且Javascript不会创建副本而是对象之间的链接(委托)

1 个答案:

答案 0 :(得分:1)

  

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

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

 Foo.prototype.constructor = null;

这两个比较都将为假。或者重写两个引用:

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