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

JavaScript类如何不传入参数获取构造时所在文件的文件名?

实现方案

__filename是Node.js在模块编译阶段注入的模块级变量,绑定的是当前代码所属文件的路径,写在类定义文件里就永远指向类文件,要无传参拿到实例化所在文件的路径,只能通过Error调用栈解析实现,示例代码如下:

const path = require('path')

class CustomCommand {
  constructor() {
    // 构造实例时捕获当前调用栈
    const stackTrace = new Error().stack
    // 堆栈第二行对应实例化调用的位置,过滤出文件路径,索引可根据实际堆栈格式调整
    const callerLine = stackTrace.split('\n')[2]
    const filePath = callerLine.match(/\(([^:]+):\d+:\d+\)/)[1]
    // 预存处理好的命令名,避免每次调用getName重复计算
    this._commandName = path.basename(filePath).split('.')[0]
  }

  getName() {
    return this._commandName
  }
}
  • 不同Node.js版本的堆栈输出格式可能有细微差异,首次使用建议先打印完整stackTrace,确认实例化调用对应的行索引,部分环境下可能是stack.split('\n')[1]
  • 该方案仅适配Node.js环境,完全匹配Discord.js机器人的开发场景
  • 若你的代码会经过压缩、打包处理,需要配置构建工具保留文件名、行号信息,否则会导致解析失败

如果能接受极少量的传参代码,更推荐显式传入当前文件的__filename,性能更高且完全不受运行环境、构建配置的影响,实现如下:

// 类定义内构造函数
constructor(fileName) {
  this._commandName = require('path').basename(fileName).split('.')[0]
}

// 各个命令文件内实例化时传入当前文件的__filename
const command = new CustomCommand(__filename)

内容的提问来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 02:54:01