如何获取JavaScript中被调用函数的父函数名称?
获取JavaScript嵌套函数的父对象名称
嘿,这个问题挺常见的——想在嵌套的方法里拿到它所属父对象的键名对吧?我给你几个靠谱的方案,你可以根据自己的场景选:
方案1:手动添加父名称属性(简单直接)
最直观的方式就是给每个父对象加一个parentName属性,然后子方法通过this访问它。这种方式适合结构固定、不会动态变化的对象:
var functions = { coolfunction1: { parentName: 'coolfunction1', add: function () { console.log(this.parentName); }, delete: function () { console.log(this.parentName); }, save: function () { console.log(this.parentName); } }, coolfunction2: { parentName: 'coolfunction2', add: function () { console.log(this.parentName); // 调用后输出: coolfunction2 }, delete: function () { console.log(this.parentName); }, save: function () { console.log(this.parentName); } } } functions.coolfunction2.add(); // 输出 "coolfunction2"
优点:实现简单,可读性强,没有兼容性问题;缺点:如果对象结构复杂或需要动态生成,手动维护parentName会很麻烦。
方案2:遍历对象自动绑定(适合动态场景)
如果你的functions对象是动态生成的,或者子对象很多,可以通过遍历自动给每个父对象添加parentName,甚至绑定方法的this上下文避免指向问题:
var functions = { coolfunction1: { add: function () { console.log(this.parentName); }, delete: function () { console.log(this.parentName); }, save: function () { console.log(this.parentName); } }, coolfunction2: { add: function () { console.log(this.parentName); // 调用后输出: coolfunction2 }, delete: function () { console.log(this.parentName); }, save: function () { console.log(this.parentName); } } } // 遍历所有父对象,自动添加parentName并绑定this for (const parentKey in functions) { if (functions.hasOwnProperty(parentKey)) { const parentObj = functions[parentKey]; parentObj.parentName = parentKey; // 给每个子方法绑定this到父对象,防止this指向丢失 Object.values(parentObj).forEach(item => { if (typeof item === 'function') { parentObj[item.name] = item.bind(parentObj); } }); } } functions.coolfunction2.add(); // 输出 "coolfunction2"
优点:一次遍历搞定所有子对象,不用重复写代码;缺点:需要确保遍历逻辑在方法调用前执行。
不推荐的方案:利用Error栈追踪
有些同学可能会想到用new Error().stack解析栈信息来获取父对象名称,但这个方法非常不可靠——不同浏览器、Node.js环境的栈格式差异很大,而且代码压缩后变量名会被混淆,根本没法准确提取到coolfunction2这种名称。所以除非你只是临时调试,否则不建议用这个方法。
内容的提问来源于stack exchange,提问作者lol
相关产品推荐
相关产品推荐

