在下面的代码中
var A = function() {};
var a = new A();
var b = new A();
A.prototype = {};
var c = new A();
console.log(a.constructor === b.constructor);
console.log(a.constructor === c.constructor);
输出为 true
和 false
。
我对错误输出很感兴趣。 a
和 c
是使用 相同 构造函数创建的,即 A
- 为什么它们的构造函数属性不同?看来我错过了什么。
附言。如果我删除我正在更改 A 输出原型(prototype)的行是:true true
。
最佳答案
当你构造一个对象时,构造函数的 prototype
属性被复制到新对象的 __proto__
中,所以当 a
和 b
保留旧原型(prototype)(其中还包含 .constructor
属性),c
使用新的空白原型(prototype)(不包含将 constructor
作为自己的属性)。这是一个图表:
在 a = new A 之后; b = 新 A
:
在 A.prototype = {} 之后; c = new A()
如您所见,直接分配给原型(prototype)会破坏 JS 对象系统,并可能导致令人惊讶的结果(您的问题证明了这一点)。这就是它通常不受欢迎的原因。
关于更改原型(prototype)时,Javascript 对象丢失了构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41034569/