• JavaScript中的instanceof原理详解


    JavaScript中instanceof为一个关键字

    用法为:

    obj instanceof con

    其返回值为true或false。 

    对于其原理的阐述一般为“Javascript 的 instanceof 操作符可以用来比较两个操作数的构造函数 constructor”。

    但constructor是什么,instanceof的判断依据又到底是什么呢? 

    首先看看实现的解释代码:

    function _instanceof( obj , func ) {
        while(true) {
           obj = obj.__proto__; // [[prototype]] (hidden) property
           if( obj == null) return false;
           if( obj ==  func.prototype ) return true;
        }
    }

    简单来说,就是

    obj.__proto__[.__proto__] === con.prototype

    因此,对instanceof 的原理应理解为

    判断obj原型链中是否有con.prototype,用处则为判断obj是否为con的一个实例。

    前述的constructor是指obj的构造函数,即obj.__proto,而非obj.__proto__.prototype.constructor的引用。

    写个样例用来区分,看着样例会容易理解很多。

    例子一:

    function O2(aa,bb){
        var aa = aa;
        this.bb = bb;
    }
    //1、正常情况
    var o2 = new O2("a2","b2");
    console.log(o2 instanceof O2);//true
    
    //2、修改了构造函数的原型对象
    var o4 = new O2("a4","b4");
    O2.prototype = {};
    console.log(o4 instanceof O2);//false
    
    //3、修改了构造函数原型对象的constructor属性
    var o6 = new O2("a6","b6");
    O2.prototype.constructor = Object;
    console.log(o6 instanceof O2);//true

    通过上面的例子可以看出,修改O2.prototype.constructor不会影响instanceof的效果。

    例子二:

        function O2(aa,bb){
            var aa = aa;
            this.bb = bb;
        }
        function O6(aa,bb){
            var aa = aa;
            this.bb = bb;
        }
        //1、正常情况
        var o2 = new O2("a2","b2");
        console.log(o2 instanceof O2);//true
        console.log(o2.__proto__ === O2.prototype);//true
    
        // 2、修改了构造函数的原型对象
        var o4 = new O6("a4","b4");    
        console.log(o4 instanceof O6);//true
        function F(){};
        O6.prototype = new F;
        console.log(o4 instanceof O6);//false
        console.log(o4 instanceof F);//false
        console.log(o4.__proto__ === F.prototype);//false
    
        //3、修改了构造函数原型对象的constructor属性
        var o6 = new O6("a6","b6");
        console.log(o6 instanceof O6);//true
        console.log(o6 instanceof F);//true
        console.log(o6.__proto__.__proto__ === F.prototype);//true    
        console.log(o6.__proto__ === F.prototype);//false

    使用这个例子便可以理解instanceof的判断条件:

    obj.__proto__[.__proto__] === con.prototype

    扩展阅读:

    例子问答: http://segmentfault.com/q/1010000002697768

    内核代码解析1:http://stackoverflow.com/questions/17701102/javascript-prototype-constructor-and-instanceof

    内核代码解析2: http://stackoverflow.com/questions/5925063/how-exactly-does-the-instanceof-works-and-relatively-is-it-slow/12874372#12874372

    官方详解: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof

  • 相关阅读:
    用户登录
    在ASP.NET里实现计算器代码的封装
    计算器的封装
    典型用户和场景-老陈、小石头
    葫芦娃团队
    20155235 王玥 《基于Arm实验箱的接口测试和应用》 课程设计报告
    实验补交专用链接随笔
    20155235 《网络攻防》 实验九 Web安全基础
    20155235 《网络攻防》 实验七 网络欺诈防范
    20155235 《网络攻防》 实验八 Web基础
  • 原文地址:https://www.cnblogs.com/dhuhank/p/4447849.html
Copyright © 2020-2023  润新知