javascript - 是否可以在实例化时检测给定类型的所有可调用方法,然后为每个方法动态创建转发过程
问题描述
我需要一种聚合类,将它的方法调用转发给它的所有组成部分。这是我写的:
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 在许多意想不到的方面都很灵活,我无法完全理解。我觉得它可能以某种形式出现。
如果您有没有完全回答问题但仍与解决方案相关的想法,请随时将它们作为评论发布。
解决方案
编辑:
鉴于另一个答案中的评论,您可以做的是创建您的类,然后将函数添加到原型中:
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]);
。
推荐阅读
- ruby - 如何修改作为参数传递给方法的数字
- android - 错误:无法解决:com.google.android.gms:play-services-ads:18.3.0
- docker - Docker“设置失败,缺少令牌凭据”
- .net - 在 .Net MVC 应用程序中集成 Kibana 仪表板?
- r - 如何使用 R markdown 和 pandoc 防止 LaTeX 文档中的 ~ (波浪号)字符转义?
- r - R:对按特定列分组的特定列求和
- algorithm - 如何选择仅包含已知单词的句子的数据结构
- git - 隐藏当前分支和主分支之间的差异以将其应用于旧提交
- python - 如何处理空的“DataFrame”:没有数字数据来绘制错误以在图表上获取字符串
- flutter - 流控制器未注册接收器事件颤动