// example:要检测的实例
// classFunc:要检测的类
function instance_of(example, classFunc) {
// TZH: 判断是否是基本类型要反向判断,即判断是否object(null特殊处理)和function。
// 因为纵观es发展历史,基本类型还可能会继续增加,但是引用类型应该会一直只有刚才说那两个,因为es进化时会考虑网络兼容性。
// 判断是否function、object可以保证随着es进化继续向后兼容。
// 下面2行是我增加的代码
if (example === null) return false
if (!/^object|function$/.test(typeof example)) return false
// 找当前实例的原型,相当于example.__proto
let proto = Object.getPrototypeOf(example);
let classPrototype = classFunc.prototype;
while (true) {
// 到了Object.prototype.__proto__
if (proto === null) return false;
// 在当前实例的原型链上找到了当前类
if (proto === classPrototype) return true;
// 继续找上一级的原型 【不是找classPrototype的上一级原型链。】
proto = Object.getPrototypeOf(proto);
}
}
// Function.prototype : Symbol.hasInstance
console.log([] instanceof Array);
// 浏览器内部其实是基于Symbol.hasInstance检测的
console.log(Array[Symbol.hasInstance]([]));
let res = instance_of([12, 23], Array);
console.log(res); // true
let res2 = instance_of({}, Object)
console.log(res2) // true
let res3 = instance_of(function () { }, Object)
console.log(res3) // true
let res4 = instance_of({}, Array)
console.log(res4) // false
let res5 = instance_of(function () { }, Array)
console.log(res5) // false
let res6 = instance_of(11, Number)
console.log(res6) // false