在JavaScript中实现instanceOf函数

时间:2012-08-25 14:47:50

标签: javascript

Stackoverflow的大家好!我一直在浏览Mozilla开发者网络的JavaScript指南,并在Details of the object model页面上看到了这个功能:

该函数用于检查对象是否是对象构造函数的实例:

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;
}

我的问题是,在同一页面上,它表示chrisEngineer类型的对象,则以下代码返回true:

chris.__proto__ == Engineer.prototype;

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

object == constructor.prototype

表达式不应该是:

object.__proto__ == constructor.prototype

或者我在这里错过了一点?感谢大家的帮助和时间!

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

我知道我来晚了一些,但是下面的代码片段的行为应该与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

答案 2 :(得分:0)

function C() {}
function D() {}

var o = new C();

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

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