JavaScript之坑了我--instanceof的判斷機制測試

eBusinessMan發表於2015-11-10

      原型鏈中的__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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章