JS的instanceof详解

337 阅读1分钟

在 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