实现一个instanceof
上篇文章002-判断JS数据类型写到,instanceof
可以判断引用类型,那么他是怎么判断的呢,现在我们来实现一个自己的instanceof
。
function myInstanceof(leftData, rightData) {
let rightDataProto = rightData.prototype; // 找到右边值的prototype
if(leftData === null) {
return false; // 直接返回false,防止第一个参数为null时报错
}
leftData = leftData.__proto__; // 找到左边值的__proto__
while(true) {
if(leftData === rightDataProto) { // 关联prototype和__proto__
return true;
}
leftData = leftData.__proto__ // 顺着原型链继续往上找
}
}
// 测试一下
function Person() {}
var person = new Person();
console.log(myInstanceof(person, Person)) // true
console.log(myInstanceof(person, Object)) // true
console.log(myInstanceof([], Array)); // true
console.log(myInstanceof(function() {}, Function)); // true
console.log(myInstanceof({}, Object)); // true
到目前为止,我们已经搞清楚instanceof是怎么生效的了,但是我们还有疑惑,为什么leftData === rightDataProto
就是true了呢?为什么myInstanceof(person, Person)
和myInstanceof(person, Object)
都是true
呢?