网上有很多类似文章,本篇文章主要是进一步分析 instanceof 的原理,并模拟其原理的实现,适合对其有一定了解的同学阅读。
附代码:
function A(){}; //创建一个A类
var a = new A(); //实例化
a instanceof A; // true
上述是一个基础的例子。我们继续看:
function B(){}; //创建一个B类
B.prototype = A.prototype; //B沿用A的原型链。
a instanceof B; //true
a本是A的实例,但是由于A引用了B的原型链,所以可以推断出 instanceof 并不能准确的判断出谁是谁的实例,也不难推断出其规则:
前者的原型链上是否 包含
后者的原型对象
为何是包含不是等于:
a instanceof Object; //true
所有对象的原型链上都有Object。
问题
3 instanceof Number; //false
为啥是false啊?3不是继承于Number么?不急,在此之前我们先了解下js的类型:
首先 js 的对象类型分为两种:
- 基础类型(String、Number、Boolean、null、undefined)
- 引用类型(Object、Array、Date …)
instanceof 只支持引用类型
的实例与类关系判断,并不适用于基础类型。
如:
3 instanceof Number; //false
var b = 'abc';
b instanceof String; //false;
b instanceof Object; //false;
typeof b; // string;
但是
var c = new String('abc'); //实例一个字符串
c instanceof String; // true
typeof c; // 意外的是object!
由此可推断出,如果typeof输出为object(除null外),则instanceof就可以为所欲为~
结论:
- 只适应于任何引用类型,不支持原始类型
- 前者的原型链上是否
包含
后者的原型对象