鉴于此方法:
var obj = {}, obj.foo = function () {};
是否可以在创建后为方法指定名称,使其看起来类似于:
var obj = {}, obj.bar = function bar() {};
foo方法是匿名的,并分配给属性。 bar方法已命名并分配给属性。
你能动态地将匿名foo方法变成一个名为foo的方法吗?函数对象上是否有可以设置的属性或类似于:
obj.foo.<name> = Object.keys(obj)[0];
请不要使用jquery。此外,这是在节点服务器应用程序中,因此跨浏览器问题无关紧要。
编辑:对我有用的答案是Daniel的链接:How to dynamically set a function/object name in Javascript as it is displayed in Chrome。此方法还处理函数的参数。
答案 0 :(得分:1)
您无法重新定义匿名函数的精确实例,但您可以使用闭包重新定义它更改其名称,如下所示:
var obj = {};
// Anonymous function
obj.foo = function() {/* whatever */};
// Renaming...
obj.foo = (function(fn) {
return function foo() {
return fn.apply(this, arguments);
}
})(obj.foo);
// Now try in the console:
obj.foo
> function foo() {
return fn.apply(this, arguments);
}
答案 1 :(得分:0)
总结上面引用的其他帖子中的两个解决方案:
1)Dynamic function name in javascript?
2)How to dynamically set a function/object name in Javascript as it is displayed in Chrome
var foo, bar, name = "bar", renameFunction;
foo = function () {return "baz";}
bar = foo;
console.log(bar.name + " / " + bar()); // / baz;
//*************** Solution #1 **********************************************
renameFunction = function (name, fn) {
return (new Function("noName", "return function " + name +
"(){ return noName() };")(fn));
}
bar = renameFunction(name, foo);
console.log(bar.name + " / " + bar()); // bar / baz;
//*************** Solution #2 **********************************************
renameFunction = function (name, fn) {
return (new Function("return function (call) {return function " + name +
" () { return call(this, arguments) }; };")())(Function.apply.bind(fn));
};
bar = renameFunction(name, foo);
console.log(bar.name + " / " + bar()); // bar / baz;
他们都工作。第二种解决方案更复杂,但我不确定它添加了什么。
更新:第二个解决方案是更好的解决方案。它可以处理第一个解决方案没有的函数参数。