3

你好 Stackoverflow 的人们!我一直在浏览 Mozilla 开发人员网络的 JavaScript 指南,并在对象模型页面的详细信息中遇到了这个功能:

函数是检查一个对象是否是对象构造函数的一个实例:

function instanceOf(object, constructor) {
   while (object != null) {
      if (object == constructor.prototype)
         return true;
      if (typeof object == 'xml') {
        return constructor.prototype == XML.prototype;
      }
      object = object.__proto__;
   }
   return false;
}

我的问题是,在同一页面上它说它chris是一个类型的对象,Engineer然后以下代码返回 true:

chris.__proto__ == Engineer.prototype;

但是,在上面的instanceOf函数中,它使用以下比较表达式来检查对象是否是构造函数的实例:

object == constructor.prototype

表达式不应该是:

object.__proto__ == constructor.prototype

还是我在这里遗漏了一点?提前感谢大家的帮助和时间!

4

3 回答 3

5

你错过了循环object = object.__proto__;底部的语句while......这会遍历原型链。该object变量包含该链中每个遍历步骤的当前对象。

于 2012-08-25T14:52:27.947 回答
1

我知道我来晚了,但以下是一个应该与 isInstanceOf 完全一样的片段

Object.prototype.instanceOf = function (type) {
    let proto = this.__proto__;
    while (proto) {
        if (proto.constructor && proto.constructor === type)
            return true;
        if (proto.__proto__)
            proto = proto.__proto__;
        else
            break;
    }
    return false;
};

console.log(Number(12).instanceOf(Number));  //true
于 2018-07-04T21:50:25.587 回答
0
function C() {}
function D() {}

var o = new C();

// true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof C;

instanceOf 将检查左侧对象和右侧对象的原型。

于 2018-07-29T14:39:05.153 回答