JavaScript中如何判断对象为指定类的直接实例,排除继承类实例?
原生JS判断对象是否为类的直接实例方案
你要的isMemberOf功能可以通过直接比对实例的隐式原型和目标类的prototype属性实现,原生JS没有内置该方法,可通过如下方式封装:
实现代码
function isMemberOf(instance, targetClass) { // 非对象类型/ null直接返回false if (instance === null || typeof instance !== 'object') return false // 直接比对实例原型和类的prototype属性 return Object.getPrototypeOf(instance) === targetClass.prototype }
测试效果
用你给出的示例类测试效果如下:
class A {} class B extends A {} let x = new A(); let y = new B(); console.log(isMemberOf(x, A)) // 输出 true console.log(isMemberOf(y, A)) // 输出 false,符合预期 console.log(isMemberOf(y, B)) // 输出 true
原理说明
JS中通过构造函数直接new生成的实例,它的原型会严格指向该构造函数的prototype对象。子类实例的原型指向的是子类自身的prototype,只有原型链更上层才会指向父类的prototype,因此直接比对原型可以过滤掉继承自父类的子类实例。
注意:不推荐使用
instance.constructor === targetClass的方式实现,该方式在手动修改了原型对象的constructor属性时会出现判断错误,稳定性不如直接比对原型。
内容的提问来源于stack exchange,提问作者DexieTheSheep
相关产品推荐
相关产品推荐

