1. タイプ判定。
ご存知のとおり、JavaScript では変数の型を検出する方法として次の 3 つが存在します。もちろん、この記事では最初の 2 つを省略し、instanceofの実装原理と手書きの instanceof の実装に焦点を当てます。
- typeof法
- Object.prototype.toString.call()
- インスタンスの
2.instanceofの実現原理。
- 正式:
instanceof演算子は、コンストラクターのプロトタイププロパティがオブジェクトのプロトタイプ チェーンのどこかに現れるをテストするために使用されます
- 言語:
Instanceof Bの場合、a はオブジェクトでなければならず、B は有効な関数でなければなりません。両方の条件が満たされる場合: B のプロトタイプ プロパティが指すプロトタイプオブジェクト( B.prototype ) がオブジェクト aのプロトタイプ チェーン上にあるかどうかを判断します。存在する場合は true を返し、存在しない場合は false を返します。つまり、instanceof の原理は、実際にはプロトタイプ チェーンを見つけるプロセスです。
3. 手書きの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