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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:42:44