You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:50:13