当前位置: 首页 > news >正文

Javascript中的instanceof

一、语法

instanceof 是一个用于检测对象与构造函数之间关系的运算符,它会检查对象是否在构造函数的原型链上,返回一个布尔值(truefalse)。

对象 instanceof 构造函数
  • 对象 的原型链中存在 构造函数.prototype,则返回 true;否则返回 false

二、用法

1. 检测对象是否为某个构造函数的实例
// 构造函数
function Person() {}
// 创建实例
const p = new Person();// 检测 p 是否是 Person 的实例
console.log(p instanceof Person); // true(p 的原型链包含 Person.prototype)// 检测 p 是否是 Object 的实例(所有对象最终都继承自 Object)
console.log(p instanceof Object); // true(p 的原型链包含 Object.prototype)
2. 检测内置对象类型
const arr = [1, 2, 3];
const obj = { name: "张三" };
const str = new String("hello"); // 字符串对象(非基本类型)console.log(arr instanceof Array); // true(arr 是 Array 的实例)
console.log(obj instanceof Object); // true(obj 是 Object 的实例)
console.log(str instanceof String); // true(str 是 String 的实例)

注意:instanceof基本数据类型(如 'hello'123)无效,因为它们不是对象:

const str = "hello"; // 基本类型字符串
console.log(str instanceof String); // false
3. 在继承关系中检测

instanceof 会沿原型链向上查找,因此子类实例也会被检测为父类的实例:

// 父构造函数
function Animal() {}
// 子构造函数
function Dog() {}// 让 Dog 继承 Animal
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;// 创建子类实例
const dog = new Dog();console.log(dog instanceof Dog); // true(直接实例)
console.log(dog instanceof Animal); // true(父类,在原型链上)
console.log(dog instanceof Object); // true(顶级父类)

三、instanceof 的工作原理

instanceof 的检测逻辑可简单理解为以下步骤:

  1. 取构造函数的 prototype(记为 proto)。
  2. 取对象的 __proto__(记为 objProto)。
  3. 比较 objProto 是否等于 proto
    • 若相等,返回 true
    • 若不等,将 objProto 指向其原型(objProto = objProto.__proto__),重复步骤 3。
    • 直到 objProtonull(原型链终点),返回 false

模拟实现:

function myInstanceof(obj, Constructor) {// 基本类型直接返回 falseif (typeof obj !== "object" || obj === null) return false;let objProto = Object.getPrototypeOf(obj); // 获取 obj 的 __proto__const targetProto = Constructor.prototype; // 构造函数的 prototypewhile (true) {if (objProto === null) return false; // 到达原型链终点if (objProto === targetProto) return true; // 找到匹配的原型objProto = Object.getPrototypeOf(objProto); // 沿原型链向上查找}
}// 测试
console.log(myInstanceof(new Person(), Person)); // true
console.log(myInstanceof([], Array)); // true

四、与 constructor 的区别

特性instanceofconstructor
检测方式沿原型链查找是否包含构造函数的 prototype直接指向创建对象的构造函数
继承场景子类实例会被检测为父类的实例(true子类实例的 constructor 指向自身构造函数
可靠性不受 constructor 被修改的影响可被手动修改,可能导致判断错误
适用类型仅适用于对象可用于基本类型(通过包装对象)

示例对比:

function Parent() {}
function Child() {}
Child.prototype = new Parent();
Child.prototype.constructor = Child; // 修复 constructorconst child = new Child();console.log(child instanceof Parent); // true(原型链包含 Parent.prototype)
console.log(child.constructor === Parent); // false(constructor 指向 Child)

五、注意事项

  1. 不能检测基本数据类型
    123 instanceof Number'abc' instanceof String 均返回 false(基本类型不是对象)。

  2. 原型被修改后可能失效
    若构造函数的 prototype 被重写,instanceof 检测结果可能不符合预期:

    function Person() {}
    const p = new Person();
    Person.prototype = {}; // 重写原型console.log(p instanceof Person); // false(p 的原型链中已没有新的 Person.prototype)
    
  3. 跨窗口/iframe 问题
    不同窗口的全局对象(如 window)不同,因此 ArrayObject 等构造函数在不同窗口中是不同的引用,可能导致 instanceof 检测错误:

    // 在 iframe 中创建的数组,在主窗口检测
    const iframeArr = window.frames[0].Array;
    console.log(new iframeArr() instanceof Array); // false(不同窗口的 Array 原型不同)
    
http://www.dtcms.com/a/301581.html

相关文章:

  • VMware Workstation Pro虚拟机的下载和安装图文保姆级教程(附下载链接)
  • 点云的协方差矩阵的三个特征值代表什么?
  • 5.7 多处理器的基本概念 (答案见原书 P278)
  • 6、企业信息化
  • 大模型应用主要组成
  • 一、openEuler 安装git 详细操作步骤
  • 俄罗斯方块游戏开发(面向对象编程)
  • CPA青少年编程能力等级测评试卷及答案 Python编程(三级)
  • Go的defer和recover
  • Windows 11 安装 jdk 8
  • Cgroup 控制组学习(三)在容器中使用 CGroups
  • goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
  • 微服务架构面试题
  • PiscCode使用OpenCV实现漂浮方块特效
  • 编程语言Java——核心技术篇(五)IO流:数据洪流中的航道设计
  • 仓库管理系统-2-后端之基于继承基类的方式实现增删改查
  • 【RL第三篇】REINFORCE Leave-One-Out(RLOO)算法(基于留一法的REINFORCE策略梯度算法)
  • RK3568基于mpp实现硬解码(一):mpp库的编译使用
  • [每周一更]-(第151期):Go语言中的Map、Slice、Array和Hash原理详解
  • 博士招生 | 香港大学 招收人工智能和网络安全方向 博士生
  • 7.27 状态机dp|质数线性筛|序列化树
  • Linux网络-------2.应⽤层⾃定义协议与序列化
  • SpringBoot实现Serverless:手撸一个本地函数计算引擎
  • mcu trace工具调研
  • elasticsearch 倒排索引原理详解
  • SpringBoot3整合Redis
  • 零基础学习性能测试第五章:性能瓶颈分析与调优-网络资源瓶颈分析与优化建议
  • Python调用大模型api并部署到前端的主流技术栈以及具体框架对比
  • 【牛客网C语言刷题合集】(四)
  • Java类加载器与双亲委派模型