instanceof介绍及手写instanceof

instanceof 是 JavaScript 中的一个操作符,用于检测一个对象是否在其原型链上有构造函数 prototype 属性。换句话说,instanceof 用来判断一个变量是否是一个特定构造函数的实例。

当你使用 instanceof 操作符时,它会检查左边操作数的原型链中是否包含右边操作数的 prototype 属性。如果是,则返回 true;否则返回 false

语法

object instanceof constructor
  • object:要检测的对象。
  • constructor:函数或者类,其 prototype 属性将被用作原型链中的一部分进行查找。

示例

function Car(make, model) {  
    this.make = make;  
    this.model = model;  
}  
  
const myCar = new Car("Ford", "Mustang");  
  
console.log(myCar instanceof Car); // true,因为 myCar 是 Car 的实例  
console.log(myCar instanceof Object); // true,因为所有对象都是 Object 的实例(或其子类的实例)  
  
// 内置对象类型检测  
console.log([] instanceof Array); // true  
console.log({} instanceof Object); // true  
console.log(new Date() instanceof Date); // true  
  
// 注意:基本类型(如 string, number, boolean)不是对象,所以 instanceof 不会返回 true  
console.log("Hello" instanceof String); // false  
console.log(42 instanceof Number); // false  
console.log(true instanceof Boolean); // false  
console.log(null instanceof Object); // false  
console.log(undefined instanceof Object); // false 
  
// 但是,如果你使用了基本类型的包装对象,情况就不同了  
console.log(new String("Hello") instanceof String); // true

注意事项

  • instanceof 操作符对于基本数据类型(如 NumberStringBoolean)和 nullundefined 不适用,因为基本数据类型不是对象,而 null 和 undefined 也没有原型链。

手写instanceof

function myInstanceOf(obj, constructor) {
  // 首先检查 obj 是否为 null 或 undefined,因为这两种类型没有原型链 
  if (!obj || typeof obj !== 'object') {
    return false
  }
  // 获取 obj 的原型
  let proto = Object.getPrototypeOf(obj)
  while (proto) {
    // 如果原型等于构造函数的原型,则返回 true
    if (proto === constructor.prototype) {
      return true
    }
    proto = Object.getPrototypeOf(proto)
  }
  return false
}

// 示例  
function Car(make, model) {
  this.make = make;
  this.model = model;
}

const myCar = new Car('Ford', 'Mustang');

console.log(myInstanceOf(myCar, Car)); // true  
console.log(myInstanceOf(myCar, Object)); // true  
console.log(myInstanceOf(null, Object)); // false  
console.log(myInstanceOf(undefined, Object)); // false  
console.log(myInstanceOf(5, Number)); // false
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值