在下面的代码中
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
- 为什么它们的构造函数属性不同?我好像错过了什么。
PS。如果我删除我正在更改A输出原型的行是:true true
。
答案 0 :(得分:3)
问题在于,当您使用A.prototype={}
时,它会更改A
对象的行为。
使用A.prototype={}
时,对象丢失了constructor
。
为什么会出现这种情况?
constructor
属性已分配给prototype
功能。
在您的情况下,A.prototype
将替换为新的对象{}
,该对象没有constructor
属性作为自己的属性(但其原型具有并等于{{ 1}})。
让我们看看以下示例:
Object
之前(2)
function A() { } // (1)
A.prototype = {} // (2)
之后(2)
Object.prototype
{
constructor:Object
}
A.prototype
//was autocreated with A
{
constructor:A
}
答案 1 :(得分:0)
将函数用作对象构造函数时,它的prototype.constructor
是使用函数的属性自动创建的。因此,最初在设置A函数之后,您将在A的原型中拥有一个构造函数:
A.prototype.constructor
因此,当您分配A.prototype = {}时,您就失去了A.prototype
中的原始构造函数。
您可以通过在A.prototype ={}
行之后添加此内容来解决此问题
A.prototype.constructor = A;
两个控制台均应记录为真