我正在尝试更改 .toString()
给出的函数名称,或创建一个具有新名称但主体相同的新函数。
function func() {}
func.toString() // returns 'function func() {}'
changename(func, "newname") // this is the functionality that I am trying to achieve
func.toString() // should now return 'function newname() {}'
我尝试使用Object.defineProperty()
,它成功更新了func.name
返回的值,但没有更新func.toString()
.
Object.defineProperty(func, "name", {
value: "newname",
writable: true,
});
func.name // returns 'newname'
func.toString() // still returns 'function func() {}'
编辑:想要这样做的原因 我需要使用一个未知名称的任意函数并将其写入一个已知名称的文件中,例如(使用nodejs):
const fs = require("fs");
changename(func, "newname");
fs.writeFileSync("tmp.js", func.toString());
tmp.js 包含:
function newname() {}
最佳答案
如果您需要做的就是将函数的代码写入文件,只需使用正则表达式将名称替换为您想要的任何名称:
let func = // whatever;
let funcCode = func.toString();
funcCode = funcCode.replace(/^function [^(]*(.*)$/, "function newName$1");
现在 funcCode
具有可以转储到文件中的文本。
更改实际函数对象的报告“名称”属性完全是另一回事,并且充其量是不可能或不切实际的。如果您只是使用函数的文本,那么这很简单。
关于Javascript重命名函数(不是变量名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58915446/