网络编程
位置:首页>> 网络编程>> JavaScript>> instanceof 内部机制探析(2)

instanceof 内部机制探析(2)

作者:lifesinger 来源:岁月如歌 发布时间:2009-09-25 13:09:00 

标签:JavaScript,instanceof,类,子类

进一步分析前,先回顾一下 new 的内部机制。代码 2 中的 new Pig() 实际上等价为:

// var pig = new Pig() 的等价伪代码:
var pig = (function() {
    var o = {};
    o.__proto__ = Pig.prototype; // line 2
    Pig.call(o);
    Pig.prototype = {/* some code */}; // line 4
    return o; // line 5
})();

可以看出,在 line 2 时,o.__proto__ 指向了 Pig.prototype 指向的值。但在 line 4 时,Pig.prototype 指向了新值。也就是说,在 line 5 返回时,pig.__proto__ !== Pig.prototype. 正是这个变化,导致了代码 2 中的 pig 不是 Pig.

已经可以大胆推论出:instanceof 判断 pig 是不是 Pig 的依据是:看隐藏的 pig.__proto__ 属性是否等于 Pig.prototype !

为了进一步确认,我们可以在 Firefox 下模拟 instanceof 的内部实现代码:

/**
 * Gecko 引擎下,模拟 instanceof
 */
function _instanceof(obj, cls) {
    // instanceof 的左操作数必须是非null对象或函数对象
    if((typeof obj !== "object" || obj === null)
            && typeof obj !== "function") {
        return false;
    }
    // instanceof 的右操作数必须是函数对象
    if(typeof cls !== "function") {
        throw new Error("invalid instanceof operand (" + cls + ")");
    }
    // 向上回溯判断
    var p = obj.__proto__, cp = cls.prototype;
    while(p) {
        if(p === cp) return true;
        p = p.__proto__;
    }
    return false;
}

测试页面:simulate-intanceof.html

最后考考大家:

function Bird() {}
var bird = new Bird();
var o = {};
bird.__proto__ = o;
Bird.prototype = o;
alert(bird instanceof Bird); // true or false?

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com