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

2018-06-26  本文已影响0人  _Danniel_

原型链中的__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 !!!

上一篇下一篇

猜你喜欢

热点阅读