为何我的ChatRoom类instanceof检查失败?
问题根源
你定义的finalResult只是一个普通的字面量对象,没有通过ChatRoom构造函数创建,所以instanceof检查会失败——instanceof的本质是判断对象的原型链是否指向目标构造函数的prototype属性,普通对象的原型链和ChatRoom类完全无关,哪怕属性完全匹配也没用。
解决方案
1. 正确创建ChatRoom实例
如果你需要真正的ChatRoom实例,必须用new关键字调用构造函数:
let finalResult = new ChatRoom({ name_of_chat_room: 'First Posted Chat Room', chat_creator_user_id: 21, chat_room_is_active: 1, chat_room_is_shareable: 1 });
这样创建的对象原型链会指向ChatRoom.prototype,instanceof ChatRoom就会返回true,执行console.log("hooray")。
2. 处理后端返回的JSON对象(常见场景)
如果finalResult是从后端API获取的JSON对象(天生就是普通对象),可以用两种方式处理:
方式一:用构造函数包装转换
把后端返回的对象传入ChatRoom构造函数,生成真正的实例:
// 假设apiResponse是后端返回的对象 const apiResponse = { name_of_chat_room: 'First Posted Chat Room', chat_creator_user_id: 21, chat_room_is_active: 1, chat_room_is_shareable: 1 }; let finalResult = new ChatRoom(apiResponse);
方式二:TypeScript类型断言(仅类型层面)
如果只需要TypeScript的类型提示,不需要运行时的instanceof检测,可以用类型断言让编译器把对象识别为ChatRoom类型:
let finalResult = apiResponse as ChatRoom;
注意:这种方式不会改变对象的原型链,instanceof仍然会返回false,仅用于TypeScript的静态类型检查。
关键知识点
instanceof不是检查对象的属性是否匹配,而是检查原型链关系:只有通过new 构造函数()创建的对象,才会在原型链上包含该构造函数的prototype,从而通过instanceof检测。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

