当我认为我理解js对象时,他们会向我抛出新的东西。
在此代码中(小提琴:http://jsfiddle.net/x8Eng/1/)
var impl = function () {
var P = function () {};
P.prototype = {};
return P;
},
P = impl();
p = new P();
console.log(p.constructor === P);
在我添加原型时检查构造函数上的相等性返回false,但如果删除添加原型的行,则返回true。通过P.prototype.prop = 'prop'
扩展原型也可以保持平等。 p instanceof P
总是返回true。
有人可以解释一下这种情况发生的复杂性吗?
答案 0 :(得分:2)
P.prototype = {};
这不仅会更改原型,还会将构造函数设置为Object
。 Object
与P
绝对不相同。
如果您希望等式成立,请在重新分配constructor
之后设置prototype
属性:
var P = function () {};
P.prototype = {};
P.prototype.constructor = P;
return P;
答案 1 :(得分:2)
在您的代码中创建的对象(通过new
或像{}
这样的文字)没有“构造函数”属性,因此当您编写p.construtor
时,它通过原型链解析,也就是说,p.__proto__
被寻找,然后p.__proto__.__proto__
等等。
由于您将P.prototype
设置为空对象,因此第一次调用失败(p.__proto__
,又名P.prototype
,又名{}
没有constructor
),所以引擎在{}.__proto__
中查找,Object.prototype
并在那里找到constructor
。当然,这个与P无关,它只是默认的Object构造函数。
请注意,instanceof
不使用构造函数,x instanceof F
被解释为x.__proto__ == F.prototype or x.__proto__.__proto__ == F.prototype
等
答案 2 :(得分:0)
“Object”类是JS中每个对象的原型,constructor
是Object类的属性。因此,如果将任何对象的prototype
属性重新分配给其他对象,则属于Object类的constructor
属性也将丢失。但是如果你向对象的原型添加任何新属性,构造函数就不会丢失。