javascript - 我可以在 Javascript/Typescript 的函数中以编程方式调用另一个具有相同名称的函数吗?

标签 javascript typescript

我实际上是在 Typescript 中处理这个问题,但我会用 Javascript 写这个问题。任何一个的答案都很好。

我有两个本质上具有相同接口(interface)的对象。我想创建一个具有相同接口(interface)的第三个对象,每个函数只调用 contains 中两个对象的方法。有没有办法以编程方式创建所有函数,这样我就不必将它们全部键入?

c = console.log;  // shorthand
obj1 = function() {}
obj1.prototype = {
  foo: (x) => { c("1" + x) },
  bar: (x, y) => { c("1" + x + y) }
}
obj2 = function() {}
obj2.prototype = {
  foo: (x) => { c("2" + x) },
  bar: (x, y) => { c("2" + x + y) }
}

obj3 = function() {
  this.o1 = new obj1()
  this.o2 = new obj2()
}
obj3.prototype = {
  foo: function(x) {
    this.o1.foo(x);
    this.o2.foo(x);
  },
  bar: function(x, y) {
    this.o1.bar(x, y);
    this.o2.bar(x, y);
  }
}

我正在寻找一种无需手动写出每个成员函数即可编写 obj3 的方法,因为我有很多成员函数。

最佳答案

您可以使用 Proxy对象:

function multiproxy(objects) {
    return new Proxy(objects[0], {
        get: function(target, name) {
            var that = this;

            return function() {
                var result;

                for (let obj of objects) {
                    result = obj[name].apply(that, arguments);
                }

                return result;
            };
        }
    });
}

所以在你的情况下,你会这样做:

var instance3 = multiproxy([new obj1(), new obj2()]);

现在,instance3 的行为类似于 obj1,但在 obj2 上调用相同的方法。

这不会处理对象的非函数属性,但添加起来并不难。

关于javascript - 我可以在 Javascript/Typescript 的函数中以编程方式调用另一个具有相同名称的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43928154/

相关文章:

javascript - Angular 5 : Multiple requests at once with forkJoin

javascript - 在 Javascript 中过滤日期

typescript - SvelteKit 中的 Pixi.js 仅在构建时出现 'self is not defined' 错误

typescript 限制对象属性的数量

javascript - 如何从json格式中选择特定的id...?

javascript - 带有可选 JavaScript 的 CSS 模态弹出窗口

javascript - javascript中函数的并行执行

Javascript 切换点击关闭

javascript - 为什么我的警告消息和背景颜色变化不同时执行?

在循环中工作时的 JavaScript 回调函数