5
    function Foo() {}

    function Bar() {}

    Bar.prototype = new Foo()

    console.log("Bar.prototype.constructor === Foo ? " 
     + (Bar.prototype.constructor === Foo))

    console.log("new Bar() instanceof Bar? " 
     + (new Bar() instanceof Bar))
=> Bar.prototype.constructor === Foo ? true
=> new Bar() instanceof Bar? true

为什么“instanceof”结果不是“false”,因为“constructor”不是指自己而是指继承的原型?

4

2 回答 2

6

instanceof不使用该constructor属性。它在内部调用[HasInstance]函数对象的方法,该方法在规范的§15.3.5.3 中有描述。

它将对象的原型(以及对象的原型等)与prototype函数的属性进行比较。

类似的实现将是:

function myInstanceOf(obj, Constr) {
    // get prototype of object
    var proto = Object.getPrototypeOf(obj);

    // climb up the prototype chain as long as we don't have a match
    while (proto !==  Constr.prototype && proto !== null) {
        proto = Object.getPrototypeOf(proto);
    }

    return proto === Constr.prototype;
}

据我所知,该constructor属性不被任何内部方法使用,仅由用户生成的代码使用。

于 2013-06-13T13:23:22.870 回答
1
Bar.prototype = new Foo()

所以

Bar.prototype instanceof Foo

所以

Bar.prototype.contructor === Foo

构造函数返回对实际函数的引用

实例

instanceof 和构造函数属性之间的区别(除了明显的语法差异)是 instanceof 检查对象的原型链。

所以:

=> new Bar() instanceof Foo? true
=> new Bar() instanceof Bar? true
=> new Bar() instanceof Object? true

以上都是真的。

于 2013-06-13T13:19:49.187 回答