Javascript闭包和*静态*类问题

时间:2011-04-30 09:55:47

标签: javascript closures static-classes

我有一个静态类,其中包含一个回调函数数组,然后我有一些其他类用于与这个静态类进行交互......

以下是静态类的简单示例:

var SomeStaticInstance = {};
(function(staticInstance) {
    var callbacks = {};
    staticInstance.addCallback = function(callback) { callbacks.push(callback); }
    staticInstance.callAllCallbacks = function() { /* call them all */ }
}(SomeStaticInstance));

然后这是我与其交互的其他类的一个例子:

function SomeClassOne() {
    this.addCallbackToStaticInstance = function() { SomeStaticInstance.addCallback(this.someCallback); }
    this.someCallback = function() { /* Do something */ }
    this.activateCallbacks = function() { SomeStaticInstance.callAllCallbacks(); }
}

function SomeClassTwo() {
    this.addCallbackToStaticInstance = function() { SomeStaticInstance.addCallback(this.someOtherCallback); }
    this.someOtherCallback = function() { /* Do something else */ }
    this.activateCallbacks = function() { SomeStaticInstance.callAllCallbacks(); }
}

现在我遇到的问题是当我调用任一类并告诉它activateCallbacks()时,类只激活它们自己范围内的回调,即SomeClassOne会调用someCallback()而不是someOtherCallback(),反之亦然,现在我假设它与闭包的范围有关,但我不知道如何得到我追求的行为......

我尝试将静态类转换为常规类,然后通过构造函数将其传递到2个类中,但仍然遇到同样的问题......

所以我的问题是如何让类来提升所有回调

- 编辑 -

这是一个显示我在实际应用程序上遇到的问题的示例,我已将所有脚本代码放入页面中以提供更清晰的示例:

http://www.grofit.co.uk/other/pubsub-test.html

这是一个简单的应用程序,有2个演示者和2个视图...一个视图关注在页面顶部添加2个数字,第二个视图关注的是获取总数并将其相乘并显示结果。< / p>

我正在使用的第三方库是PubSubJS,第一个演示者会监听一个事件,告诉它其中一个框已更改并重新排列第一行。第二个演示者在顶部的乘法或总数发生变化时进行侦听,然后重新计算底部变量。现在第一个演示者正确地重新计算,并且第二个演示者将在乘法框改变时正确地重新计算,但是!当顶部的总数发生变化时,它会 NOT 重新计算,甚至认为它应该收到通知...

无论如何,请快速查看页面上的源代码,看看我的意思......

2 个答案:

答案 0 :(得分:1)

首先,我认为你需要var callbacks = [](一个数组而不是一个对象)因为你正在使用callbacks.push()。

我不确定我理解你的问题。您的类的结构方式,您可以通过实例化这两个类并在两个新对象上调用addCallbackToStaticInstance()来实现您想要的。如,

var one = new SomeClassOne();
var two = new SomeClassTwo();
one.addCallbackToStaticInstance();
two.addCallbackToStaticInstance();
one.activateCallbacks();

然后,如上所述,您可以从任一对象调用activateCallbacks()。

如果你说在实例化其中一个类之后你想要能够调用activateCallback(),你真的必须重新考虑你的方法。我首先将addCallbackToStaticInstance()和activateCallbacks()移动到他们自己的类中。

答案 1 :(得分:0)

这是一种非常奇怪的处理方式,但是你的主要问题是你的回调对象不是SomeStaticInstance的一部分,它是在一个匿名闭包中定义的。您的回调对象{}也应该是数组[]

尝试staticInstance.callbacks = [];而不是var callbacks = {};

staticInstance.addCallback = function(callback) { 
  this.callbacks.push(callback); 
}