我正在尝试更改.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);
但这样,你就没有了身体的功能。