一. 类型判断。
众所周知,在JavaScript中,检测一个变量的类型,无疑有以下三种方法。当然,本文会略过前两种,重点讲述instanceof的实现原理和手写instanceof的实现。
- typeof法
- Object.prototype.toString.call()
- instanceof
二. instanceof 的实现原理。
- 官方:
instanceof 运算符用于测试构造函数的 prototype 属性是否出现在对象原型链中的任何位置。
- 白话文:
如果 a instanceof B ,那么 a 必须要是个对象,而 B 必须是一个合法的函数。在这两个条件都满足的情况下:判断 B 的 prototype 属性指向的原型对象( B.prototype )是否在对象 a 的原型链上。如果在,则返回true;如果不在,则返回false。简而言之, instanceof 的原理其实就是一个查找原型链的过程。
三. 手写 instanceof 的实现。
function myInstanceof(left,right){
//获取(构造)函数的(显式)原型
let rp = right.prototype;
//获取对象的(隐式)原型
left = left.__proto__;
//判断对象的(隐式)原型是否等于(构造)函数的(显式)原型
while(true){
if(left === null){
return false
}
if(left === rp){
return true
}
left = left.__proto__
}
}
let a = /12/;
let b = '123';
console.log(a instanceof RegExp,myInstanceof(a,RegExp)); //true,true
console.log(b instanceof RegExp,myInstanceof(b,RegExp)); //false,false