当前位置:首页 > JavaScript

js实现instanceof

2026-01-31 20:36:24JavaScript

instanceof 运算符简介

instanceof 是 JavaScript 中的运算符,用于检测构造函数的 prototype 属性是否出现在对象的原型链中。其语法为 object instanceof constructor,返回布尔值。

手动实现 instanceof

以下是手动实现 instanceof 功能的代码示例:

function myInstanceof(obj, constructor) {
  // 检查 constructor 是否有效
  if (typeof constructor !== 'function' || !constructor.prototype) {
    throw new TypeError('Right-hand side of instanceof is not callable');
  }

  // 处理原始类型直接返回 false
  if (obj === null || typeof obj !== 'object') {
    return false;
  }

  // 获取对象的原型
  let proto = Object.getPrototypeOf(obj);

  // 遍历原型链
  while (proto !== null) {
    if (proto === constructor.prototype) {
      return true;
    }
    proto = Object.getPrototypeOf(proto);
  }

  return false;
}

实现说明

  1. 参数验证:确保 constructor 是有效的构造函数(具有 prototype 属性)。
  2. 原始值处理:原始类型(非对象)直接返回 false,符合原生 instanceof 的行为。
  3. 原型链遍历:使用 Object.getPrototypeOf() 获取对象的原型,并沿原型链向上查找。
  4. 匹配判断:如果找到与构造函数 prototype 相同的对象,返回 true

使用示例

function Person() {}
const p = new Person();

console.log(myInstanceof(p, Person)); // true
console.log(myInstanceof(p, Object)); // true
console.log(myInstanceof([], Array)); // true
console.log(myInstanceof(123, Number)); // false(原始类型)

注意事项

  1. 跨框架对象检测可能失效,不同执行环境的相同构造函数可能不共享原型。
  2. 手动实现无法完全模拟内置对象(如 ArrayDate)的检测行为。
  3. 现代 JavaScript 中推荐使用 Symbol.hasInstance 自定义 instanceof 行为。

替代方案

对于更可靠的类型检测,可考虑:

js实现instanceof

  • Object.prototype.toString.call(obj)
  • Array.isArray() 等内置方法
  • typeof 运算符(针对原始类型)

标签: jsinstanceof
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…