javascript“execute-all”方法,用于对象的所有实例

时间:2014-06-09 03:18:54

标签: javascript object

假设我有以下内容:

function FooBar (s) {
  this.s = s;
  this.logS = function () { console.log(this.s)}
}
var Foo = new FooBar('foo');
var Bar = new FooBar('bar');

我的目标是为.logS()的每个实例调用FooBar。我可以单独打电话来做到这一点:

Foo.logS();
Bar.logS();

但是,假设我不知道FooBar类型的所有对象的名称 - 是否有一种方法可以执行所有这些对象?例如,原则上我希望使用以下代码:FooBar.logS()等同于调用Foo.logS()Bar.logS()

那显然不起作用,但我原则上正在寻找类似的东西。如果失败了,有没有办法获得所有FooBar实例对象的名单?

例如,我可以这样做:

for (var o in window) { 
  if (window[o] instanceof FooBar) {
    window[o].logS();
  }
}

但这只适用于直接在window下的对象。如果我要说这样做......

var bazs = [new FooBar('baz')];

......循环不起作用。我想我可以通过递归遍历window来创建一个函数,但我想充其量只会慢但可能找不到所有这些(也许?)

TL; DR

目标是找到object的{​​{1}} (object instanceof FooBar),无论object嵌套在window

内的哪个地方{/ 1}}

可能的?

修改:澄清

我道歉,似乎我不够清楚。在创建实例时跟踪实例的建议方法很棒(数组,订阅),但这不是我需要的。

更详细的方案。在整个网页中多次使用第三方脚本。我可以在页面底部插入自己的代码。因此,在创建任何实例之前,我不会改变FooBar来跟踪事物。因此,当我的代码执行时,我的代码需要找到已存在的所有FooBar实例。

1 个答案:

答案 0 :(得分:2)

您可以创建FooBar的新实例,将该实例添加到数组中。 E.g:

function FooBar() {
    FooBar.instances.push(this);
    // ...
}
FooBar.instances = [];

FooBar.logS = function() {
    FooBat.instances.forEach(function(instance) {
        instance.logS();
    });
};

或者,您可以实现事件处理或发布/订阅者系统,其中FooBar的每个实例都会侦听特定事件,然后您只需触发该事件。 E.g。

function FooBar() {
    // ...
    Arbiter.subscribe('logS', this.logS.bind(this));
}

Arbiter.inform('logS');

如果你不想自己实现这样的东西,那里就有现有的库,例如: https://github.com/mroderick/PubSubJS