You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让字面量方式创建的JavaScript对象通过instanceof检测?

解决对象字面量无法通过instanceof检测的问题

嘿,这个问题我之前也碰到过,咱们一步步来拆解和解决~

首先得搞清楚为什么你会遇到这个报错:TypeError: Right-hand side of 'instanceof' is not callable。因为instanceof的右侧必须是可调用的构造函数,而你用对象字面量创建的Person1是一个普通对象,不是函数,直接拿它当instanceof的右侧肯定会报错。

那怎么让字面量创建的对象能通过自定义构造函数的instanceof检测呢?核心是要让这个字面量对象的原型链上包含目标构造函数的prototype属性,下面给你两种实用的方法:

方法1:用Object.setPrototypeOf修改原型链

先定义你的构造函数,然后手动把字面量对象的原型指向构造函数的prototype:

// 先定义自定义构造函数
function Person() {}

// 用字面量创建对象
const Person1 = { name: "张三", age: 25 };

// 修改Person1的原型,让它指向Person.prototype
Object.setPrototypeOf(Person1, Person.prototype);

// 现在检测就正常了!
console.log(Person1 instanceof Person); // true

方法2:用Object.create直接创建带指定原型的对象

如果不想事后修改原型,也可以直接用Object.create创建一个以Person.prototype为原型的对象,再添加属性(效果和字面量类似,但更高效):

function Person() {}

// 创建原型为Person.prototype的对象,再添加属性
const Person1 = Object.create(Person.prototype);
Person1.name = "张三";
Person1.age = 25;

console.log(Person1 instanceof Person); // true

额外说明:默认的字面量对象其实是Object的实例

如果你的需求只是确认它是对象类型,那不用改原型,直接检测Person1 instanceof Object就会返回true——因为所有字面量对象的原型链默认都会指向Object.prototype。

最后再补一句原理:instanceof的工作逻辑是检查右侧构造函数的prototype是否存在于左侧对象的原型链上。函数式创建的Person2(比如new Person())天生就把Person.prototype放在原型链里,而字面量对象默认只有Object.prototype,所以咱们要手动给它加一层原型,才能通过自定义构造函数的检测。

内容的提问来源于stack exchange,提问作者Human Cyborg Relations

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:49:01