如何在ES5/ES5.1环境中获取对象的类名?
ES5.1(JerryScript/Fitbit环境)中获取对象类名的方案
在ES6中可以通过.constructor.name获取对象的类名,但在Fitbit采用的ES5.1轻量引擎JerryScript中,不仅ES6的class语法无法直接运行,constructor.name也会返回undefined。比如你尝试的这段ES6代码:
class something { constructor() { console.log(this.constructor.name); } } new something();
预期输出something,但实际返回undefined——核心原因是JerryScript不支持ES6 class语法,也未实现函数的name属性。
方案1:手动为构造函数添加name属性
ES5中用构造函数模拟类,手动给构造函数添加name属性,就能实现类似ES6的效果:
function Something() { console.log(this.constructor.name); } // 手动添加name属性 Something.name = 'Something'; new Something(); // 输出 "Something"
方案2:从构造函数的字符串表示中提取类名
如果不想手动维护name属性,可以通过Function.prototype.toString()获取构造函数的字符串,再用正则提取函数名:
function getConstructorName(obj) { const funcString = obj.constructor.toString(); // 匹配"function 函数名(...)"格式中的函数名 const nameMatch = funcString.match(/^function\s+([^\s(]+)/); return nameMatch ? nameMatch[1] : 'Anonymous'; } function Something() { console.log(getConstructorName(this)); } new Something(); // 输出 "Something"
注意:如果构造函数是匿名函数,或者代码经过压缩混淆,这种方法可能失效,但Fitbit开发场景下一般不会有这类问题。
方案3:在实例中直接定义类名字段
如果只需要在实例中获取类名,也可以在构造函数内部直接给实例添加className属性:
function Something() { this.className = 'Something'; console.log(this.className); } new Something(); // 输出 "Something"
内容的提问来源于stack exchange,提问作者My1
相关产品推荐
相关产品推荐

