JavaScript小进阶10--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 !!!