我有一个带有方法的对象数组 a
, b
, c
, 和 d
.我想用这些相同的方法创建一个“委托(delegate)人”对象,这些方法只需调用数组中每个对象的相应方法。我目前在下面的解决方案似乎有不必要的重复(即函数 a
、 b
、 c
和 d
的定义几乎相同。如果我不必记住它也很好每次向“委托(delegate)”对象添加方法时,都会向委托(delegate)对象添加方法。有没有更好的方法来准备委托(delegate)对象?
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();
关于javascript - 如何委托(delegate)给 JavaScript 中的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31250243/