如何在JavaScript中获取执行上下文对象的名称?
如何让方法输出所属对象的变量名?
嘿,我来帮你搞定这个问题!你现在的代码里,console.log(this)会输出当前的上下文对象(也就是a对应的那个Object{}),但JavaScript的对象本身并不存储指向它的变量名——变量名只是一个指向对象的引用而已,所以没法直接从this里拿到'a'这个字符串。
下面给你几种可行的解决思路:
方法1:给对象添加名称属性
最简单的方式就是手动给对象加一个标识它的name属性,这样方法里就能直接通过this.name获取到:
function checkObj(){ console.log(this.name); } var a = {checkObj:checkObj, name: 'a'}; a.checkObj(); // 输出: 'a'
这种方式直观又可靠,不管对象在什么作用域里都能生效,唯一的小缺点是需要额外维护这个name属性。
方法2:通过全局作用域查找变量名(仅限全局变量)
如果你的对象变量是在全局作用域里定义的,可以通过遍历全局对象的属性来找到对应变量名:
function checkObj(){ // 全局对象在浏览器里是window,Node.js里是global const globalObj = typeof window !== 'undefined' ? window : global; const objName = Object.keys(globalObj).find(key => globalObj[key] === this); console.log(objName); } var a = {checkObj:checkObj}; a.checkObj(); // 输出: 'a'
⚠️ 注意:这种方法有局限性——如果多个变量指向同一个对象,会返回第一个匹配的键名;而且如果对象不在全局作用域里(比如在函数内部定义),这种方法就失效了。
方法3:用闭包保存对象名称
如果不想给对象添加额外属性,可以用工厂函数通过闭包来保存对象的名称:
function createNamedObject(objName) { return { checkObj: function() { console.log(objName); } }; } // 创建带名称标识的对象 var a = createNamedObject('a'); a.checkObj(); // 输出: 'a'
这种方式更灵活,而且不需要修改对象本身的结构,闭包会帮你记住对象的名称,不管对象被传递到哪里,调用checkObj都能正确输出名称。
总的来说,第一种方法是最常用也最稳妥的,如果你只是需要一个标识,给对象加个name属性就好啦!
内容的提问来源于stack exchange,提问作者Sami Kh
相关产品推荐
相关产品推荐

