gpt4 book ai didi

javascript - 如何委托(delegate)给 JavaScript 中的对象数组

转载 作者:行者123 更新时间:2023-11-30 16:45:56 24 4
gpt4 key购买 nike

我有一个带有方法的对象数组 a , b , c , 和 d .我想用这些相同的方法创建一个“委托(delegate)人”对象,这些方法只需调用数组中每个对象的相应方法。我目前在下面的解决方案似乎有不必要的重复(即函数 abcd 的定义几乎相同。如果我不必记住它也很好每次向“委托(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com