在 JavaScript 中,判断⼀个变量的类型尝尝会⽤ typeof 运算符,在使⽤ typeof 运算符时采⽤引⽤类型存储值会出现⼀个问题,⽆论引⽤的 是什么类型的对象,它都返回 “object”。这就需要⽤到instanceof来检测某个对象是不是另⼀个对象的实例。 另外,更重的⼀点是 instanceof 可以在继承关系中⽤来判断⼀个实例是否属于它的⽗类型。
例如:
Foo.prototype = new Aoo();//JavaScript 原型继承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true
//上⾯的代码中是判断了⼀层继承关系中的⽗类,在多层继承关系中,instanceof 运算符同样适⽤。
//⼜如:
console.log(Object instanceof Object);//true
console.log(Function instanceof Function);//true console.log(Number instanceof Number);//false
console.log(String instanceof String);//false
console.log(Function instanceof Object);//true
console.log(Foo instanceof Function);//true
console.log(Foo instanceof Foo);//false
手写一个instanceof
function myInstanceof(left, right) {
// 这里先用typeof来判断基础数据类型,如果是,直接返回false
if(typeof left !== 'object' || left === null) return false;
// getProtypeOf是Object对象自带的API,能够拿到参数的原型对象
let proto = Object.getPrototypeOf(left);
while(true) { //循环往下寻找,直到找到相同的原型对象
if(proto === null) return false;
if(proto === right.prototype) return true;//找到相同原型对象,返回true
proto = Object.getPrototypeof(proto);
}
}
// 验证一下自己实现的myInstanceof是否OK
console.log(myInstanceof(new Number(123), Number)); // true
console.log(myInstanceof(123, Number)); // false