instanceof操作符在MDN上的解释为:定义instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链的任何位置。
1、作用:判断一个引用是否属于某构造函数或在继承关系中判断一个实例是否属于他的父类型。
2、判断逻辑:从当前引用的proto一层一层顺着原型链往上找,看能否找到对应的prototype。
3、使用方法:object instanceof constructor。
object指的是需要测试的对象,constructor指的是构造函数。判断object的原型链上是否有constructor.prototype。如果object是constructor的一个实例,就返回true;否则返回false。
4、实现instanceof:
function _instanceof(obj,fun){
let f = fun.prototype;
obj = obj._proto_;
while(true){
if(obj === null){
return false;
}
if(f === obj){
return true;
}
obj = obj._proto_;
}
}
5、与typeof的异同之处
相同点:都可以判断变量类型
不同点:instanceof只能判断对象、函数和数组,不能判断字符串和数字等;而typeof可用于判断一个表达式的原始值。
6、栗子们
//未发生继承
function F(){};
function H(){};
var f = new F();
var h = new H();
console.log(f instanceof F); //true
console.log(f instanceof H); //false
console.log(f instanceof Object); //true
console.log(F.prototype instanceof Object); //true
console.log(h instanceof F); //false
console.log(h instanceof H); //true
console.log(h instanceof Object); //true
console.log(H.prototype instanceof Object); //true
//发生继承
function F(){};
function H(){};
F.prototype = new H();
var f = new F();
console.log(f instanceof F); //true
console.log(f instanceof H); //true
console.log(f instanceof Object); //true
console.log(F.prototype instanceof Object); //true
console.log(h instanceof F); //false
console.log(h instanceof H); //true
console.log(h instanceof Object); //true
console.log(H.prototype instanceof Object); //true
instanceof与原型和原型链联系紧密,若要搞清楚其中底层原理,可先参考下篇,再回头看此篇,就容易多了。