Javascript 嵌套在对象中的函数如何知道其路径?

Javascript 嵌套在对象中的函数如何知道其路径?,javascript,object,recursion,Javascript,Object,Recursion,我希望能够调用fo并从(被调用方)内部生成表示其“对象地址”或路径的字符串,例如“example.fee.set.fo” 这是否需要一个迭代“根”对象的函数(即示例) 其目的是参考谁正在呼叫服务器端 举个例子={ 费用:{ 设置:{ fo(){ myName=???//此处:生成一个值为“example.fee.set.fo”的字符串 $.ajax({data:{WhosCalling:myName,foo:'bar'}}); }, } } } 构建一个函数,该函数接受一个对象和“根地址”,并递

我希望能够调用
fo
并从(被调用方)内部生成表示其“对象地址”或路径的字符串,例如“example.fee.set.fo”

这是否需要一个迭代“根”对象的函数(即
示例

其目的是参考谁正在呼叫服务器端

举个例子={
费用:{
设置:{
fo(){
myName=???//此处:生成一个值为“example.fee.set.fo”的字符串
$.ajax({data:{WhosCalling:myName,foo:'bar'}});
},
}
}
}

构建一个函数,该函数接受一个对象和“根地址”,并递归地进入其中,沿途收集每个嵌套函数的路径

然后用一个函数包装这些嵌套函数,该函数接受它们的参数,应用它们并返回其地址

我的建议是保持嵌套函数完好无损。但将它们封装在一个函数中,该函数既可以执行它们,也可以与服务器通信

例如:

const通信=(路径,fn)=>
(…args)=>{
const addr=path.join('.');
const exec=fn(…args);
console.log(`callfrom${addr}:${exec}`);//或$.ajax()
返回执行器;
};
常数baz=x=>x+10;
const baz_with_communicate=communicate(['foo','bar','baz'],baz]);
baz_与_通信(10);
//=>日志:“来自foo.bar.baz的呼叫:20”
//=> 20
因此,现在您不需要执行“功能与通信”业务,这是在
spy
功能中自动完成的

从您的评论来看,您似乎正在努力理解函数以函数作为参数并返回其他函数的概念。然而,这是一个强大的概念,您应该熟悉它,因为它将帮助您设计强大的抽象


⚠️ 此操作不会在Edge上运行(使用
对象。fromEntries
,目前尚不支持此操作)

const通信=(路径,fn)=>
(…args)=>{
const addr=path.join('.');
const exec=fn(…args);
console.log(`callfrom${addr}:${exec}`);//或$.ajax()
返回执行器;
};
常量间谍=(o,…路径)=>
Object.fromEntries(
对象
.条目(o)
.map([k,v])=>
v!==null&&typeof v===“对象”
?[k]
,spy(v,…path.concat(k))
]
:typeof v==“函数”
?[k]
,通信(路径concat(k),v)
]
:[k]
v
]));
const o_spy=spy(o,‘示例’);
控制台日志(o_spy.foo.bar.baz(5));
console.log(o_spy.bar.baz.bat(5))

康斯特o=
{foo:
{bar:
{baz:x=>x+10}
,酒吧:
{baz:
{bat:x=>x+20}};

我就是这样解决的
举个例子={
费用:{
设置:{
fo(){let myName=arguments.callee.address;
console.log(myName);//我现在可以获得这个函数的位置名了
//现在,我可以使用它向服务器提供上下文和标识自己
//IE$.ajax({data:{WhosCalling:myName,foo:'bar'});
},
}}};
功能fn_地址(obj、loc){
$.each(obj,function(k,v){let _loc=(loc?loc+):'')+k;/#。每个都需要jQuery--pure js:for(本例中的变量i)
if(typeof v=='object'){返回fn_地址(v,_loc)}//遍历对象
//↓ 下面将地址(即“example.fee.set.fo”)绑定到函数命名空间↓
if(typeof v=='function'){v.address=\u loc;}
});
}
fn_地址(例如,“示例”)//遍历对象,向嵌套函数添加“地址”
example.fee.set.fo()

fo
是否只返回其地址,还是应该先做其他事情?在这种情况下,
fo
可以被修饰成它的地址作为它的第一个参数吗?@customcommander我昨晚错过了这个评论。是的,它可以做很多事情。我只需要地址,这样我就可以将它传递到服务器端进行上下文处理。“你是谁?”。我不知道如何通过“fo”中的变量和装饰中的地址来实现这一点。这个问题闻起来像一个问题。很高兴您提供了一些上下文,但是您能解释为什么服务器端关心对象中的变量名被调用吗?很可能,对于你真正想要解决的问题X,这是一个糟糕的解决方案,详细阐述这一点可能会让我们提供更好的解决方案。在“fo”中,这将如何工作?它必须用于调用方,而不是被调用方。我希望‘fo’能够“告诉”服务器端“他的全名”。@intellilogic这是我在你最初的问题中问的。要么修改
fo
签名,使其可以接受其地址作为第一个参数。或者让修饰函数处理与服务器的通信。这样你就可以把事情分开并保持干净:
fo
做它自己的事情,而decorator执行
foo
,并将地址传达给你的服务器。我不明白我怎么能在函数内部得到这个。fo()。您通常会(至少我建议您这样做)在decorator中添加这种逻辑。请参见
装饰
功能。目前我使用的是
console.log
,但它可以做任何你想做的事情。关键是装饰器为您进行通信并执行装饰函数;将其传递给服务器。”“foo”的值是“fo”?你能写下我的实际例子让我理解吗?你能解释一下这是如何工作的,为什么这是一个很好的解决问题的方法吗?这根本不能为未来的读者提供太多的信息。我也建议分开