为何B.C子类显示为匿名类且instanceof校验始终返回false
问题原因
为什么B.C显示为匿名类
你给B.C赋值时用的是匿名类表达式:
B.C = class extends B { constructor() { super(); this.a = 3; } }
JS中类表达式如果class关键字后没有显式声明类名,就属于匿名类,这类类的内置name属性为空字符串,打印时自然会显示[class (anonymous) extends B],对应实例的constructor.name也会是空值,完全符合语法规范。
如果需要让类显示正常名称,给类表达式加上显式类名即可:
B.C = class C extends B { constructor() { super(); this.a = 3; } }
修改后打印B.C会显示[class C extends B],实例的constructor.name也会返回"C"。
为什么test instanceof B.C返回false
按照标准ES6规范,你贴出的原始代码里test instanceof B.C本应返回true:instanceof的判断逻辑是检查实例的原型链上是否存在构造函数的prototype对象,和类是否有名字没有任何关联。
如果你的环境中判断结果始终为false,通常是以下两种原因导致:
- 创建
test实例之后,你又对B.C进行了重新赋值,导致现在的B.C已经不是当初创建实例时用的那个构造函数 - 你使用的运行环境对ES6类的实现存在兼容bug(老旧浏览器、特殊沙箱环境可能出现这类问题)
你可以加一行代码做验证:
console.log(test.__proto__.constructor === B.C)
标准环境下这行代码会返回true,如果返回false就说明当前环境中B.C的指向或者实例原型链出现了异常。
内容的提问来源于stack exchange,提问作者Constantin Suiu
相关产品推荐
相关产品推荐

