Javascript重命名函数(不是变量名)



我正在尝试更改.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() {}

如果您只需要将函数的代码写入文件,只需用regex将名称替换为您想要的任何名称:

let func = // whatever;
let funcCode = func.toString();
funcCode = funcCode.replace(/^function [^(]*(.*)$/, "function newName$1");

现在funcCode具有可以转储到文件中的文本。

更改实际函数对象的报告"名称"属性完全是另一回事,充其量是不可能或不切实际的。如果您只是使用函数的文本,这很容易。

如果您可以扩展toString函数,这应该可以工作:

function func() {}
func.toString() // returns 'function func() {}'
changeName=function(funcToExtend, name){
funcToExtend.toString = () => name;
}
changeName(func,"new name");
func.toString(); // new name 

实现这一点的一种方法是更改toString函数的工作方式。我不认为这是一个好的解决方案,但我想出了这个:

function test(){
console.log('hello');
}
test.newName = 'helloFunc';
test.toString = function(){
var str = Function.prototype.toString.call(this);
return 'function ' + this.newName + str.substring(str.indexOf('('), str.length);
}
console.log(test.toString());

我相信一个更好的解决方案可以实现Function构造函数。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

如果您只想要一个具有新名称的新字符串,可以这样做:

function func() {}
console.log(func.toString())
Object.prototype.changeName = function (newName) {
return "function " + newName + "(){}";
}
let newNameFunction = func.changeName("newName")
console.log(newNameFunction);

但这样,你就没有了身体的功能。

最新更新