假设我有以下内容:
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
可能的?
修改:澄清
我道歉,似乎我不够清楚。在创建实例时跟踪实例的建议方法很棒(数组,订阅),但这不是我需要的。
更详细的方案。在整个网页中多次使用第三方脚本。我可以在页面底部插入自己的代码。因此,在创建任何实例之前,我不会改变FooBar来跟踪事物。因此,当我的代码执行时,我的代码需要找到已存在的所有FooBar实例。
答案 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