为什么添加原型会导致构造函数不相等

时间:2013-06-27 09:39:18

标签: javascript object constructor

当我认为我理解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。

有人可以解释一下这种情况发生的复杂性吗?

3 个答案:

答案 0 :(得分:2)

    P.prototype = {};

这不仅会更改原型,还会将构造函数设置为ObjectObjectP绝对不相同。

如果您希望等式成立,请在重新分配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属性也将丢失。但是如果你向对象的原型添加任何新属性,构造函数就不会丢失。