让我说我有这段代码。
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不会创建副本而是对象之间的链接(委托)
答案 0 :(得分:1)
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