获取 ES6 类实例的类名

2022-08-30 01:41:06

是否有任何“和谐”的方法可以从ES6类实例中获取类名?以外

someClassInstance.constructor.name

目前,我依靠Traceur实现。似乎Babel有一个polyfill,而Traceur没有。Function.name

总而言之:在ES6 / ES2015 / Harmony中没有其他方法,并且在ES中没有任何预期ATM。下一个。

它可能为未被破坏的服务器端应用程序提供有用的模式,但在用于浏览器/桌面/移动设备的应用程序中是不需要的。

Babel使用core-js来polyfill Function.name,它应该根据需要手动加载Traceur和TypeScript应用程序。


答案 1

someClassInstance.constructor.name正是执行此操作的正确方法。转译器可能不支持此功能,但这是规范的标准方式。(通过类声明生产声明的函数的属性在 14.5.15 的步骤 6 中设置。name


答案 2

正如@Domenic所说,请使用 .@Esteban评论中提到someClassInstance.constructor.name

someClassInstance.constructor是一个函数。所有函数都有一个属性...name

因此,要静态访问类名,请执行以下操作(这适用于我的Babel版本BTW。根据评论@Domenic您的里程可能会有所不同)。

class SomeClass {
  constructor() {}
}

var someClassInstance = new SomeClass();
someClassInstance.constructor.name;      // === 'SomeClass'
SomeClass.name                           // === 'SomeClass'

更新

Babel很好,但丑陋/缩小最终确实给我带来了麻烦。我正在制作一个游戏,并正在创建一个池化Sprite资源的哈希(其中键是函数名称)。缩小后,每个函数/类都被命名为 。这会杀死哈希值。我正在这个项目中使用,在阅读了gulp-uglify文档后,我发现有一个参数可以防止这种局部变量/函数名称的重整发生。所以,在我的吞噬文件中,我改变了tGulp

.pipe($.uglify()).pipe($.uglify({ mangle: false }))

这里需要权衡性能与可读性。不修改名称将导致(略微)更大的构建文件(更多的网络资源)和潜在的代码执行速度(需要引用 - 可能是BS)。另一方面,如果我保持相同,我将不得不在每个ES6类上手动定义 - 在静态和实例级别。不,谢谢!getClassName

更新

在评论中讨论之后,似乎避免使用约定来支持定义这些功能是一个很好的范例。它只需要几行代码,并且允许代码的完全缩小和通用性(如果在库中使用)。所以我想我改变了主意,会手动定义我的类。谢谢@estus!无论如何,与直接变量访问相比,Getter/Setters通常是一个好主意,尤其是在基于客户端的应用程序中。.namegetClassName

class SomeClass {
  constructor() {}
  static getClassName(){ return 'SomeClass'; }
  getClassName(){ return SomeClass.getClassName(); }
}
var someClassInstance = new SomeClass();
someClassInstance.constructor.getClassName();      // === 'SomeClass' (static fn)
someClassInstance.getClassName();                  // === 'SomeClass' (instance fn)
SomeClass.getClassName()                           // === 'SomeClass' (static fn)