// 自己实现 instance,left 代表 instanceof 左值,right代表 instanceof 右值
function instance(left, right) {
let proto = Object.getPrototypeOf(left);
let prototype = right.prototype;
while (true) {
// 如果传入的 left 的原型不存在,则直接返回 false
if (!proto) {
return false;
}
// 如果传入的 right 刚好是 left 的上一级,则直接返回 true
if (proto === prototype) {
return true;
}
// console.log(proto);
// 否则将当前 left的原型 赋值为 left原型的原型(上一级原型)进入循环继续比较
proto = Object.getPrototypeOf(proto);
}
}
// 测试
function Animal(name) {
this.name = name;
}
function Cat(color) {
this.color = color;
}
Cat.prototype = new Animal("cat1");
let cat1 = new Cat("gray");
console.log(cat1); // Animal { color: 'gray' }
console.log(Object.getPrototypeOf(cat1)); // Animal { name: 'cat1' }
console.log(Object.getPrototypeOf(Cat)); // {}
console.log(Object.getPrototypeOf(Animal)); // {}
console.log(Object.getPrototypeOf(Object.getPrototypeOf(cat1))); // {}
console.log(cat1 instanceof Cat); // true
console.log(cat1 instanceof Animal); // true
console.log(cat1 instanceof Object); // true
console.log(Animal instanceof Object); // true
console.log("===========================");
console.log(instance(cat1, Cat)); // true
console.log(instance(cat1, Animal)); // true
console.log(instance(cat1, Object)); // true
console.log(instance(Animal, Object)); // true