Google App Script中装饰器调用类方法无法访问实例属性的问题
解决类方法传入装饰器后无法访问实例属性的问题
问题原因
当你把类实例的方法(比如debug_c.debug_f)直接作为参数传递给performanceLogger时,该方法会丢失原本的上下文绑定——this不再指向debug_c实例,而是变为undefined,因此调用时会触发错误信息: "无法读取未定义属性'name'"。
三种可行解决方案
方案1:使用bind绑定上下文
传递方法时,用bind将方法与实例绑定,确保this始终指向该实例:
function app(){ let debug_c = new Debuggin_Class(); // 绑定实例作为方法的this上下文 return performanceLogger(debug_c.debug_f.bind(debug_c)) }
方案2:修改装饰器,支持传入上下文
调整performanceLogger函数,新增上下文参数,通过call指定this调用方法:
// 修改后的装饰器,支持传入实例上下文 function performanceLogger(context, func,...params){ var logger = new ProjectLogger("logs") try{ var startTime = new Date().getTime(); // 用call指定this为传入的实例 var data = func.call(context,...params) var endTime = new Date().getTime(); logger.logToSheet(`${func.name} 函数运行无异常,耗时:${endTime-startTime} ms.`) return data } catch(e){ logger.logToSheet(`${func.name} 函数运行出错:${e.message}`, true) } } // 调用时传入实例和对应方法 function app(){ let debug_c = new Debuggin_Class(); return performanceLogger(debug_c, debug_c.debug_f) }
方案3:用箭头函数包装方法调用
箭头函数会继承外层作用域的上下文,用它包装方法调用后再传给装饰器:
function app(){ let debug_c = new Debuggin_Class(); // 箭头函数保留外层的实例上下文 return performanceLogger(() => debug_c.debug_f()) }
方案说明
- 方案1操作最简单,适合快速适配现有代码;
- 方案2扩展性更强,适合需要统一管理上下文的场景;
- 方案3语法简洁,若方法需传参,需在箭头函数内传递参数,例如
() => debug_c.debug_f(param1, param2)。
内容的提问来源于stack exchange,提问作者kaankesk
相关产品推荐
相关产品推荐

