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不创建副本,但对象之间的链接(委托)
。只是我们正在进行重新分配,在这种情况下,新对象应该获得一个新的内存位置。