Javascript 链接对象';在重新分配原型时未重写的构造函数属性

Javascript 链接对象';在重新分配原型时未重写的构造函数属性,javascript,Javascript,假设我有这个代码 function Foo(){} Foo.prototype.constructor === Foo; // true var a = new Foo(); a.constructor === Foo; // true 因此这里基本上是a.constructor通过委托过程返回Foo,并从Foo.prototype.constructor获取该值 嗯。现在如果我把Foo.prototype写成 function Foo(){} Foo.prototype.constructo

假设我有这个代码

function Foo(){}
Foo.prototype.constructor === Foo; // true
var a = new Foo();
a.constructor === Foo; // true
因此这里基本上是
a.constructor
通过委托过程返回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
也被修改并返回与
Foo.prototype.constructor
相同的值,因为a毕竟链接到Foo.prototype,Javascript不创建副本,而是在对象之间创建链接(委托)

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

不是这样,它存储对对象的引用。现在在您的例子中,
Foo.prototype
a[[prototype]]
引用同一个对象,然后您更改
Foo.prototype
,但是
a[[prototype]]
的引用仍然指向旧对象。但是,如果您这样做:

 Foo.prototype.constructor = null;
那么两个比较都将为false。或者您重写了两个引用:

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

好啊我现在明白了。此语句
Javascript不创建副本,但对象之间的链接(委托)
。只是我们正在进行重新分配,在这种情况下,新对象应该获得一个新的内存位置。