Javascript 分配调用方的匿名注入方法工厂名

Javascript 分配调用方的匿名注入方法工厂名,javascript,Javascript,我需要定义name函数,以便与下面的另一个方法一起使用,所以我需要对它进行动态命名 目前 `use strict`; const factory = () => () => {} const method = factory(); method.name === undefined && const factory = () => { const name = () => {}; return name } const method = facto

我需要定义name函数,以便与下面的另一个方法一起使用,所以我需要对它进行动态命名

目前

`use strict`;
const factory = () => () => {}

const method = factory();

method.name === undefined

&&
const factory = () => { const name = () => {}; return name }

const method = factory();

method.name === "name"
因为

`use strict`;
const factory = () => () => {}

factory() === () => {} // and () => {} is not a named method

但是我想

`use strict`;
const factory = () => () => {}

const method = factory();

method.name === "method"

这是额外的描述,因为stack overflow希望我说得更多,但我认为问题是不言自明的

将您的arrow函数设置为传统函数:

如果名称是动态的,那么我们必须处理函数的name属性是只读的这一事实。函数定义可以以动态方式进行,但这涉及到解析,或者我们可以创建一个代理:

const factory==>newproxy=>console.loghello,{ getobj,道具{ 返回prop==name?方法:prop; } }; 常数法=工厂法; console.logmethod.name;
方法 您可以通过创建具有动态名称prop的对象并将函数指定给该prop来实现此目的:

`使用严格的`; 常数工厂=s=> {[s]:=>{}[s] 常量方法=工厂“废话”;
console.logmethod.name这行吗?不过,你必须重复这个名字,所以不确定它是否完全符合你的要求

let factory = (name) => new Function(`return function ${name}() {}`)();
let method = factory("method");
method.name; // "method"

根据@trincot的答案,最初提出的方案是不可能的

然而,以下是我为一个足够的替代方案所做的:

`使用严格的`; //@trincot的回答 常量renameFunction=name,func=>newproxyfunc,{ getobj,道具{ 返回道具===名称?名称:道具; } } const identifyFunction=obj=>{ 如果对象的类型===对象{ //因为对象将原始对象定义为属性 //我们可以把名字取出来 const name=Object.keysobj[0]; const func=obj[name]; 返回重命名函数名,func } //如果它不是一个对象,则假定它已命名并返回 返回obj } const useFooName=foo=>{ 设foo=foo; //只需要确定它是否是一个对象 如果typeof _foo==对象{ _foo=identifyFunctionfoo } //同时使用函数及其名称 console.log`${{u foo.name}${{u foo}`; } 常量工厂=func=>func; const foo=工厂=>bar; useFooNamefoo//bar
useFooName{foo}//foo-barI认为问题是不言自明的,除了-为什么名称属性很重要?您需要一个命名函数并使用lambda。为什么?我不认为你在尝试什么是可能的,这听起来像是一个XY问题。你要解决的实际问题是什么,你需要这样做。95%的人都会问这样的问题,这是他们代码中的一个缺陷,他们认为做这样的随机事情就是解决办法。这就像用锤子打开窗户一样。是的,它会工作,但解锁它打开它是一个更好的解决方案。很抱歉,我正在试图理解问题的核心,可能会引导您找到更好的解决方案。我需要动态命名它,这在您的问题中是不存在的。证明它不是那么不言自明的?在我的回答中添加了更多内容来涵盖动态部分。是的,但这与你所说的有点矛盾。。。它应该有变量的名称。但是您有bar.name=='foo'…事实上,变量名只在解析时存在,而不是在执行时。如果您希望名称在执行时存在,那么您可以考虑属性,而不是变量。的确如此。然而,我担心OP想要的结果会导致极其脆弱的代码。该名称可能会因任何原因被更改。例如,在将来,有人可能决定执行const method=memoizefactoryblah,突然,如果f.name===blah{doSomething}不起作用,代码就会执行。此外,如果需要传入名称,它已经不是很动态了。您还可以使用Object.definePropertymethod,name,{value:blah}。
let factory = (name) => new Function(`return function ${name}() {}`)();
let method = factory("method");
method.name; // "method"