instanceof概述
刚开始学习javascript的时候,我们一般认为instanceof用于判断一个对象是否是某个构造函数的实例,但这种表述并不准确。
其真正含义是判断一个构造函数的prototype属性所指向的对象是否在另一个被检测对象的原型链上
语法
obj instanceof F
描述:obj.proto.proto… => F.prototype,沿着对象obj的原型链查找是否存在对象F.prototype,若存在则返回true,若查找到原型链的终点Object.prototype仍未找到,则返回false。
用法
1.常规用法
function Animal() {}
var a = new Animal();
console.log(a instanceof Animal); // true
2.原型继承用法
function Animal() {}
var a = new Animal();
function Cat() {}
var c1 = new Cat();
Cat.prototype = a;
var c2 = new Cat();
console.log(c1 instanceof Cat); // false
console.log(c2 instanceof Cat); // true
console.log(c1 instanceof Animal); // false
console.log(c2 instanceof Animal); // true
在这个例子中,在Cat.prototype指向改变前、后创建Cat的对象,instanceof的判断结果会不同
下面结合原型链图来分析
在Cat.prototype = a;改变原型指向之后,c1的__proto__任然指向原来的Cat的原型对象,c2在原型指向改变之后创建,其__proto__指向新的Cat原型对象即Animal的实例对象a。
3.复杂用法
console.log(Object instanceof Object); //true
//左边Object的原型链:Object -> Object.__proto__ -> Function.prototype -> Function.prototype.__proto__
// ->Object.prototype
//右边Object的原型:Object -> Object.prototype
console.log(Function instanceof Function); //true
//左边Function的原型链:Function -> Function.__proto__ -> Function.prototype
//右边Function的原型:Function -> Function.prototype
console.log(Function instanceof Object); //true
//Function -> Function.__proto__ -> Function.prototype -> Function.prototype.__proto__ -> Object.prototype
//Object -> Object.prototype
console.log(Object instanceof Function); //true
//Object -> Object.__proto__ -> Function.prototype
//Function -> Function.prototype
console.log(Array instanceof Array); //false
//左边Array的原型链:Array -> Array.__proto__ -> Function.prototype -> Function.prototype.__proto__
// -> Object.prototype
//右边Array的原型:Array -> Array.prototype
上面的用法可能不太好理解,需要对原型链有个充分的认识
JavaScript原型(prototype)、proto、原型链及其结构图