美文网首页
JavaScript小进阶10--instanceof的判断机制

JavaScript小进阶10--instanceof的判断机制

作者: _Danniel_ | 来源:发表于2018-06-26 10:30 被阅读0次

    原型链中的__proto__属性的作用非常大,是整个原型链串起来的根本,是整个原型继承体系的本质!!instanceof 就是根据原型链上的继承关系判断的。这个特点就和java的instanceOf相似了。我们来测试一下,instanceof的判断机制,

    如下:

    一种情况:基于W3C标准的浏览器:

           function Person(){}

                var person1 = new Person();

           console.log(person1  instanceof  Person); //true

           function Student(){}

                var stu1 = new Student();

           console.log(stu1  instanceof  Student); //true

           function BoyStu(){}

                var boy1 = new BoyStu();

           console.log(boy1  instanceof  BoyStu); //true

           stu1.__proto__ = person1;//此时stu1.constructor“追溯”于person1.constructor

           boy1.__proto__ =  stu1;//此时boy1.constructor (--> stu1.constructor) --> person1.constructor

     //注意了:

    console.log(boy1  instanceof  BoyStu);//false因为boy1.constructor--> person1.constructor

    console.log(boy1  instanceof  Student); //false:因为boy1.constructor--> person1.constructor

    console.log(boy1  instanceof  Person);//true: 因为boy1.constructor--> person1.constructor

    console.log(boy1  instanceof  Object); //true: 因为boy1.constructor--> person1.__proto__.constructor

    console.log(stu1  instanceof  Student); //false: 因为boy1.constructor--> person1.constructor

    console.log(stu1  instanceof  Person); //true: 因为stu1.constructor--> person1.constructor

    console.log(stu1  instanceof  Object); //true: 因为stu1.constructor--> person1.__proto__.constructor

    console.log(person1  instanceof  Person); //true: 因为stu1.constructor--> person1.constructor

    console.log(person1  instanceof  Object); //true:       因  为  person1.constructor-->

    person1.__proto__.constructor

    一种更普通的情况:

           function Person(){}

                var person1 = new Person();

           console.log(person1  instanceof  Person); //true

           function Student(){}

                var stu1 = new Student();

           console.log(stu1  instanceof  Student); //true

           function BoyStu(){}

           var BoyStu_prototype_  =  BoyStu.prototype ;

           var boy1 = new BoyStu();//boy1.__proto__  指向 BoyStu_prototype_

           console.log(boy1  instanceof  BoyStu); //true

           BoyStu.prototype = stu1 ;  //注意!

           console.log(boy1  instanceof  BoyStu); //false : 因为BoyStu.prototype 不再指向:BoyStu_prototype_

           boy1.__proto__ = stu1 ;  //注意!

           console.log(boy1  instanceof  BoyStu); //true: 因为BoyStu.prototype 和 boy1.__proto__指向一致

                     经过上面的测试:

           我们可以得出结论:

                   类A的实例对象A_Obj ,只有当A_Obj.__proto__ == A.prototype && A_Obj.__proto__!= null&& A_Obj.__proto__!=undefined时,A_Obj instanceof A 才是true !!!

    相关文章

      网友评论

          本文标题:JavaScript小进阶10--instanceof的判断机制

          本文链接:https://www.haomeiwen.com/subject/vlepyftx.html