我想知道是否有办法彻底改变通过Function
构造函数构建的函数的名称。
首先,我尝试创建一个新的函数,然后它似乎又有anonymous
的名称:
const fnName = 'test';
const fn = new Function('a', 'b', 'c', 'console.log("function works");');
然后我发现虽然fn.name
属性不可写,it seems to be configurable in ES2015。所以我继续使用Reflect.defineProperty
更改了它:
Reflect.defineProperty(fn, 'name', { configurable: true, value: fnName });
console.log(fn.name); // 'test'
当我将函数输出到字符串时,它仍然具有名称anonymous
,因此我覆盖了toString
函数:
const originalToString = fn.toString;
fn.toString = function() {
return originalToString.call(this).replace('anonymous', fn.name);
}
fn.toString();
// "function test(a, b, c) {
// console.log("function works");
// }"
然而,当我把它放入控制台时,我无法弄清楚如何更改显示的名称:
有没有办法做到这一点,或者这只是JS运行时的某些内部属性无法触及?
PS:这是一个纯粹的学术问题。