如何让字面量方式创建的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

