1

就在我认为我理解 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总是返回真。

有人可以解释为什么会发生这种情况的复杂性吗?

4

3 回答 3

2
    P.prototype = {};

这不仅改变了原型,还将构造函数设置为Object. 并且Object绝对不等同于P.

如果您希望等式成立,请constructor在重新分配后设置属性prototype

var P = function () {};
P.prototype = {};
P.prototype.constructor = P;
return P;
于 2013-06-27T09:44:49.960 回答
2

在您的代码中创建的对象(通过new或类似 的文字{})没有“构造函数”属性,因此当您编写 时p.construtor,它通过原型链解析,即p.__proto__查找,然后p.__proto__.__proto__等等。

由于您设置P.prototype为空对象,因此第一次调用失败(p.__proto__, aka P.prototype, aka {}has no constructor),因此引擎查找{}.__proto__,它是Object.prototype并在constructor那里找到。当然,这个和P无关,只是默认的Object构造函数。

注意instanceof不使用构造函数,x instanceof F被解释为x.__proto__ == F.prototype or x.__proto__.__proto__ == F.prototype

于 2013-06-27T10:01:59.270 回答
0

“Object”类是JS中每个对象的原型,constructor是Object类的一个属性。因此,如果您将prototype任何对象的属性重新分配给其他对象,则constructor属于 Object 类的属性也会丢失。但是如果你给一个对象的原型添加任何新的属性,构造函数并不会丢失。

于 2013-06-27T09:45:38.047 回答