Javascript:给定函数列表,如何创建一个将这些函数作为属性的对象
Javascript: given list of functions, how to create an object having those functions as properties?
给定:
var f1 = function(){return "a";};
var f2 = function(){return "b";};
var f3 = function(){return "c";};
transformToObject([f1, f2, f3]);
如何创建函数:
function transformToObject(arrayOfFuncs){...};
返回:
{
f1: function(){return "a";},
f2: function(){return "b";},
f3: function(){return "c";}
}
困难似乎是获取变量的名称来创建对象的属性。
注意:由于我以将匿名函数赋值给变量的形式定义函数,因此函数的"name"属性无济于事,因为它是空的,这意味着:
function a(){};
//a.name === "a"
var b = function(){};
//b.name === ""
var f1 = function(){return "a";};
var f2 = function(){return "b";};
var f3 = function(){return "c";};
var obj = {f1: f1, f2: f2, f3: f3};
alert(obj.f1());
演示
根据您的编辑,也许是这样的:
var f1 = function(){return "a";};
var f2 = function(){return "b";};
var f3 = function(){return "c";};
function transformToObject(){
return {f1: f1, f2: f2, f3: f3};
}
var myObjectHasFunctions = transformToObject();
alert(myObjectHasFunctions.f1());
演示2
或者一些非常疯狂的东西:
var f1 = function a(){return "a";};
var f2 = function b(){return "b";};
var f3 = function c(){return "c";};
var arrayOfFuncs = [f1, f2, f3]
function transformToObject(arrayOfFuncs){
var obj = {}
obj.functions = []
arrayOfFuncs.forEach(function(test){
obj.functions.push({name: test.name, method: test})
});
return obj;
}
var myObjectHasFunctions = transformToObject(arrayOfFuncs);
myObjectHasFunctions.functions.forEach(function(func){
alert(func.method());
});
演示3
但是你最好做一些类似(2)的事情,如各种评论中所述。
通过查看全局范围的属性来查找匹配值,这是可能的:
var transformToObject = (function(scope){
return function(arrayOfFuncs){
var obj = {};
for(var prop in scope){
if(scope.hasOwnProperty(prop) && arrayOfFuncs.indexOf(scope[prop]) > -1){
obj[prop] = scope[prop]
}
}
return obj
}
})(this)
。虽然这是一件非常糟糕的事情
如果可能的话 - 你最好将你的函数修改为:
transformToObject(['fn1','fn2','fn3']);
更好的是,从一开始就将函数作为对象的属性。
似乎您最初应该只创建对象,而不是数组。但是如果你只想分配任意函数名称,你可以做这样的事情:
function transformToObject(arrayOfFuncs){
var len = arrayOfFuncs.length,
functionMap = {},
funcName;
for (i=0; i<len; i++) {
funcName = "f" + i;
functionMap[funcName] = arrayOfFuncs[i];
}
return functionMap;
};
问题是函数的名称在您的代码中丢失,因此无法恢复。您需要以某种方式提供它们。
如果你提前知道它们并且可以放入一个数组,那么你的代码将只是:
function transformToObject(fns, names) {
var r = {};
for (var i = 0, n = fns.length; i < n; ++i) r[names[i]] = fns[i];
return r;
}
如果你有一个函数,它会返回一个给定函数的名称:
function transformToObject(fns, namer) {
var r = {}
for (var i = 0, n = fns.length; i < n; ++i) r[namer(fns[i])] = fns[i]
return r;
}
编辑:切:)
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 我可以在json对象中添加一个函数吗
- Javascript使函数一个接一个地执行
- 是JavaScript中的函数一个对象
- 两个几乎相等的jQuery函数;一个适用于IE,一个不适用于IE
- 两个Javascript函数一个window.onload=Custom.init;和一个window.onload=f
- 使javascript加载函数一个接一个地执行
- 如何通过两个嵌套的匿名函数(一个带有超时的事件处理程序)传递变量
- 为什么我不能让两个jQuery函数一个在另一个里面呢?
- 给函数一个变量名,而不是它的值
- 如何使用嵌入函数(一个滚动页由Pete - peachananr)
- 是否有可能给JavaScript函数一个类型/类?
- 确保两个函数一个接一个地执行,其中第一个函数内部有一个异步调用
- 两个不同的ajax函数一个接一个调用返回相同的值
- jQuery第一次更改函数一个工作
- 给这个函数一个id
- 如何给回调函数一个值一个变量在特定时刻
- 使用回调使两个函数一个接一个地运行
- 两个函数(一个用php)是否可以用“;onclick”;
- 两个几乎相同的函数.一个函数用Queue进行排队.Jquery效果在queued函数上不起作用.为什么