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

如何修改JavaScript函数调用toString()时显示的函数名称

问题原因

Function.prototype.toString() 的返回值并非读取函数的 name 属性动态生成,而是取自函数定义时的源代码快照,所以单纯修改 name 属性不会改变 toString() 的输出结果。

实现方案

方案1:单独重写目标函数的toString方法

适合只需要处理单个函数的场景,不会影响全局其他函数的行为:

function foo() {}
// 修改name属性
Object.defineProperty(foo, 'name', {value: 'bar'})
// 重写当前实例的toString方法
foo.toString = function() {
  return `function ${this.name}() {}`
}

// 测试
console.log(foo.toString()) // 输出 "function bar() {}"

方案2:全局重写Function.prototype.toString

适合需要批量适配所有函数的场景,注意要保留原始toString的逻辑避免破坏原有功能:

// 先缓存原始的toString方法
const originalFunctionToString = Function.prototype.toString;

Function.prototype.toString = function() {
  // 先获取原始输出结果
  const rawOutput = originalFunctionToString.call(this);
  // 把原始函数名替换为当前name属性的值
  return rawOutput.replace(/^function\s+[^(\s]+/, `function ${this.name}`);
}

// 测试
function foo() {}
Object.defineProperty(foo, 'name', {value: 'bar'})
console.log(foo.toString()) // 输出 "function bar() {}"

// 带参数和函数体的场景也可以正常适配
function add(a, b) {
  return a + b;
}
Object.defineProperty(add, 'name', {value: 'sum'})
console.log(add.toString()) 
// 输出 "function sum(a, b) { return a + b; }"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:09:03