在ES6中获取超类名称

joe*_*elg 11 javascript ecmascript-6

我有一个类,另一个类扩展了该类.

class Shape {
  constructor() {
    return this;
  }
}
class Circle extends Shape {
  constructor() {
    super();
    return this;
  }
}
let foo = new Circle();
Run Code Online (Sandbox Code Playgroud)

我可以和foo一起上课

let className = foo.constructor.name 
// returns string 'Circle'
Run Code Online (Sandbox Code Playgroud)

是否有可能以类似的方式获得foo的超类('Shape')的名称?

小智 15

Object.getPrototypeOf(Object.getPrototypeOf(foo)).constructor.name;
Run Code Online (Sandbox Code Playgroud)


joe*_*elg 6

知道了:

let superClassName = foo.__proto__.__proto__.constructor.name
// return Shape
Run Code Online (Sandbox Code Playgroud)

编辑:这将返回父类,它不一定是最初扩展的类 Circle。在我的用例中,它们是相同的,但此处“超类”的含义存在微妙的歧义。

  • `Object.getPrototypeOf` 会比 `__proto__` 更标准。 (3认同)

jos*_*ike -3

您的最终超类始终是 Object,因此尝试派生它是没有意义的。您需要使用“is”关键字来探测相关实例是否是其他实例的实例。我是从 Actionscript-3 的角度写这篇文章的,所以我不确定 ES-6 中的语法到底是什么,但它应该遵循“if (this is Shape)”的思路。如果相关实例扩展了您正在讨论的类,则返回 true,否则返回 false。

然而,您要问的是 Shape 从标准库或标准对象中分支出来,编译器或运行时无法弄清楚这一点。理论上,如果 ECMA 语言能够为给定类提供向后继承数组,那就太好了,但据我所知,这不是也从来不是一个功能。如果没有完整的继承链,您需要知道您正在寻找什么超类,否则您无法以任何逻辑方式派生它。