获取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)
- 正确使用const来定义JavaScript中的函数
- 你如何JSON.stringify ES6地图?
- ES6 Promise.all()error handling – 是.settle()需要?
- require('babel / register')不起作用
- Reactfunction无状态组件,PureComponent,组件; 有什么区别,什么时候应该用什么?
- 为什么在JavaScript中为“块”范围的variables声明select了“let”?
- 什么是ECMAScript 6类中的getter和setter?
- 如何使用ES6模块模拟unit testing的依赖关系
- 箭头函数与函数声明/expression式:它们是等价的还是可交换的?