我有对象与方法的阵列a
,b
,c
,和d
。我想用这些相同的方法创建一个“委托”对象,这些方法只是在数组中的每个对象上调用相应的方法。下面我目前的解决方案似乎有不必要的重复(即,函数的定义a
,b
,c
,和d
几乎是一样的。这也将是很好,如果我没有记住我每次添加一个时间的方法添加到委托对象“委托”对象的方法有没有更好的方法来准备委托对象?
Delegator = (function () {
"use strict";
var objectList = [];
var callOnAll = function(functionName, args) {
objectList.forEach(function(logger) {
logger[functionName].apply(logger, args);
});
};
return {
add : function (handler) { objectList.push(handler); };
a: function() { callOnAll('a', arguments); };
b: function() { callOnAll('b', arguments); };
c: function() { callOnAll('c', arguments); };
};
}());
我知道__noSuchMethod__
; 但是,这似乎是非标准的。
这是一种更动态的方法,不需要您事先知道方法名称:
var Delegator = (function () {
"use strict";
var objectList = [];
var callOnAll = function(functionName, args) {
objectList.forEach(function(logger) {
if (typeof logger[functionName] === 'function') {
logger[functionName].apply(logger, args);
}
});
};
function addMethods(handler) {
Object.keys(handler).forEach(function (key) {
if (!(key in obj) && typeof handler[key] === 'function') {
obj[key] = function () { callOnAll(key, arguments); };
}
});
}
var obj = {
add : function (handler) {
objectList.push(handler);
addMethods(handler);
}
};
return obj;
}());
Delegator.add({
a: function () { console.log('called a()!'); },
b: function () { console.log('called b()!'); }
});
Delegator.add({
a: function () { console.log('called a()!'); },
});
Delegator.a();
Delegator.b();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句