获取ES6类实例的类名

新手上路,请多包涵

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

someClassInstance.constructor.name

目前我指望 Traceur 实现。 Babel 似乎有一个 Function.name 而 Traceur 没有。

总结一下:在 ES6/ES2015/Harmony 中没有其他方法,在 ES.Next 中也没有期望的 ATM。

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

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

原文由 Estus Flask 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 605
2 个回答

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

原文由 Domenic 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

因此,要静态访问类名,请执行以下操作(顺便说一句,这适用于我的 Babel 版本。根据 @Domenic 上的评论,您的情况可能会有所不同)。

 class SomeClass {
  constructor() {}
}

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

更新

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

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

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

更新

在评论中的讨论之后,似乎避免 .name 支持定义这些函数的约定是一个很好的范例。它只需要几行代码,并且允许完全缩小和通用代码(如果在库中使用)。所以我想我改变了主意,将在我的课程中手动定义 getClassName 。谢谢 @estus! .无论如何,与直接变量访问相比,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)

原文由 James L. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏