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

标签 javascript

我有一个带有方法的对象数组 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/

相关文章:

javascript - 如何在 Matter.js 中启用碰撞?

javascript - 当 URL 少于/多于 X 个字符时隐藏内容

javascript - jQuery 动画的几个问题

asp.net - VS2010渲染控件JS很尴尬

javascript - Angular/karma : Error: [$injector:nomod] Module 'module' is not available

javascript - 将项目导入 React 后不再播放声音

javascript - 如何使用 ng-if 比较字符串?

javascript - D3js 拖动与点击

javascript - drawImage 在 Canvas 上绘制图像,但在任何事件之后它都会消失图像 fabricjs

javascript - 如何创建一个以插入符号开头、以 anchor 结尾的选区?