获取ES6类实例的类名

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

someClassInstance.constructor.name 

目前我正指望Traceur的实施。 而且Babel似乎有一个用于Function.name polyfill,而Traceur则没有。

综上所述:在ES6 / ES2015 / Harmony中没有其他方法,ES中没有预期的ATM。

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

Babel 使用core-js j来填充Function.name ,它应该适当地为Traceur和TypeScript应用程序手动加载。

someClassInstance.constructor.name是完全正确的方法来做到这一点。 运输商可能不支持这一点,但这是每个规范的标准方式。 (通过ClassDeclaration生成的函数的名称属性在14.5.15的第6步中设置)

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

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

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

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

更新

巴别尔很好,但是丑化/缩小最终导致了我的问题。 我正在做一个游戏,并创build一个混合的Sprite资源(其中的关键是函数名称)的散列。 缩小后,每个函数/类都被命名为t 。 这杀死了哈希。 我在这个项目中使用了Gulp ,在阅读了gulp-uglify文档之后,我发现有一个参数可以防止这个局部variables/函数名称发生变化。 所以,在我的大文件中,我改变了

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

这里有一个性能vs可读性的折衷。 不改变名称会导致(稍微)更大的构build文件(更多的networking资源)和可能较慢的代码执行(需要引用 – 可能是BS)。 另一方面,如果我保持相同,我将不得不在每个ES6类上手动定义getClassName – 在静态和实例级别。 不用了,谢谢!

更新

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

 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)