JavaScript之坑了我--instanceof的判断机制测试

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29900383/viewspace-1827371/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29900383/viewspace-1827371/

你可能感兴趣的:(JavaScript之坑了我--instanceof的判断机制测试)