instanceof 内部机制探析(2)

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

进一步分析前,先回顾一下 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?

标签:JavaScript,instanceof,类,子类
0
投稿

猜你喜欢

  • 如何做好一份前端工程师的简历?

    2009-02-17 12:52:00
  • Python全栈之列表数据类型详解

    2023-05-05 15:27:10
  • 解决django-xadmin列表页filter关联对象搜索问题

    2023-01-13 22:19:13
  • Python中defaultdict与dict的差异详情

    2023-10-02 19:39:29
  • JavaScript中的对象的extensible属性介绍

    2024-06-05 09:30:38
  • 使用GitLab+Jenkins实现持续集成CI环境的示例代码

    2022-09-25 23:14:04
  • 将python代码和注释分离的方法

    2022-04-06 12:04:50
  • ORACLE 10g 安装教程[图文]

    2023-07-15 07:07:27
  • 无组件上传图片到数据库中,asp解决方案

    2007-08-03 13:22:00
  • php中让上传的文件大小在上传前就受限制的两种解决方法

    2023-10-25 17:53:12
  • Python入门学习之类的相关知识总结

    2021-12-18 10:02:38
  • MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现

    2024-01-19 00:23:03
  • python字符串定义的三种方式

    2022-05-27 08:17:57
  • Python生成随机数的方法

    2022-10-18 12:57:28
  • Python 抓取数据存储到Redis中的操作

    2022-11-28 03:13:12
  • 关于SSD目标检测模型的人脸口罩识别

    2023-06-20 05:20:56
  • Python利用pynimate实现制作动态排序图

    2023-05-25 03:31:32
  • 基于django ManyToMany 使用的注意事项详解

    2022-10-16 00:29:33
  • Python实现的用户登录系统功能示例

    2021-07-02 03:38:18
  • python 如何上传包到pypi

    2023-12-22 13:31:41
  • asp之家 网络编程 m.aspxhome.com