首页 > 解决方案 > 是否可以在实例化时检测给定类型的所有可调用方法,然后为每个方法动态创建转发过程

问题描述

我需要一种聚合类,将它的方法调用转发给它的所有组成部分。这是我写的:

class CompositeSpritesheet {
    sprites = []; // collect Spritesheet objects
    draw() {
        this.sprites.forEach(s => (s.draw.apply(s, arguments)))
    }
    init() {
        this.sprites.forEach(s => (s.init.apply(s, arguments)))
    }
    nextStep() {
        this.sprites.forEach(s => (s.nextStep.apply(s, arguments)))
    }
    // ... for all possible functions
}

let board = new Spritesheet("a");
let text = new Spritesheet("b");

let composite = new CompositeSpritesheet();
composite.sprites.push(wood,text);
composite.draw(20,30);

这段代码确实是重复的,不是详尽的,可能会因意外的函数调用而失败,最重要的是真的很恶心。有没有一种方法可以概括这一点,也许可以编写一个高阶类来随心所欲地生成这样的组合?

换句话说,JavaScript 中是否有一种机制可以让我复制以下伪代码的行为?

class CompositeSpritesheet{
    sprites = [];
    *("fn", args){
        this.sprites.forEach(s => (s[fn]?.apply(s, arguments)))
    }
}

这可能是一个愚蠢的问题,但我发现 JavaScript 在许多意想不到的方面都很灵活,我无法完全理解。我觉得它可能以某种形式出现。

如果您有没有完全回答问题但仍与解决方案相关的想法,请随时将它们作为评论发布。

标签: javascriptclassmethodsdynamic

解决方案


编辑:

鉴于另一个答案中的评论,您可以做的是创建您的类,然后将函数添加到原型中:

class CompositeSpritesheet {
    sprites = [];
};

var functionsToCreate = ["draw", "init", "nextStep"];

for (let f of functionsToCreate) {
    CompositeSpritesheet.prototype[f] = function() {
        this.sprites.forEach(s => (s[f].apply(s, arguments)));
    }
}

因此 CompositeSpritesheet 将在其原型中包含您想要的所有功能,因此您将能够调用composite.draw(20,30);.

您唯一需要做的就是填充functionsToCreate数组。

======================

我可以看到的一个解决方案可能是只调用一个具有不同参数的方法:

class CompositeSpritesheet {
    function doSomething(action, args) {
        this.sprites.forEach(s => (s[action].apply(s, args)));
}

所以你可以打电话composite.doSomething("draw", [20,30]);


推荐阅读