nodejs constructor instanceof constructor

今天在做数据缓冲,新旧实体对比的时候,使用 underscore.js 的 isEqual 方法,结果因为一些问题不能工作。于是跟踪到 underscore 内部去看,发现了这段代码:

    // Objects with different constructors are not equivalent, but `Object`s
    // from different frames are.
    var aCtor = a.constructor, bCtor = b.constructor;
    if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
                             _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
      return false;
    }

本来 instanceof 这个东西就是用来看一个对象的实例:

var str = new String("hello");
console.log(str instanceof String); // true

在我的印象中也就是用来做如上这种判断而已,所以当我发现了 underscore 中这种 aCtor instanceof aCtor 的情况时表示十分不能理解。找了好几个地方都没有什么资料,最后只有自己用穷举研究了一边。

constructor instanceof constructor

穷举遍历所有 GLOBAL 下的对象,发现除了 console、process、Infinity、isFinite、undefined 之外,其他所有内置对象的 constructor 都是自己 constructor 的实例。

而所有能 new 出来实例的,除了 Object 和 Function 的实例,其他实例的 constructor 都不是自己 constructor 的实例。

根据上述现象,我没有丝毫技术含量 (Orz) 的得出了这个结论:

aCtor = a.constructor
当 aCtor instanceof aCtor == true 的时候

这个 a 只可能是内置全局对象,或者是 Object 和 Function 的实例。。

(环境 nodejs v0.10.15)

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s