1

我正在开发一个带有服务器端组件的 JavaScript 应用程序。目的是在画布上拥有多个不同的对象,这些对象在多个浏览器之间是同步的(即具有相同的外观)。同步由服务器端组件完成,该组件将各个更改广播到所有浏览器。每当一个对象发生变化时,它必须通知服务器,然后由哪个服务器负责通知其他浏览器。

画布上的对象由 JavaScript 对象表示,其属性决定了用户的外观。当然,并不是所有的属性对外观都很重要。因此,只需将重要属性的更改传输到其他浏览器。对象有不同的“类”,但所有对象都从一个共同的“超类”“继承”(我知道,类继承术语在 JavaScript 中并不真正适用,但在这种情况下,我认为这样更容易) .

现在,我在以优雅的方式发送客户端-服务器通知时遇到了一些麻烦。目前,我对不同对象的所有重要属性都有设置方法。这些 setter 方法调用一个将通知发送到服务器的函数。

我不太喜欢那个解决方案,因为它引入了很多样板代码。理想情况下,当我创建一个新对象时,我希望能够只指定重要的属性并对其进行处理。负责监视这些属性变化的逻辑可能在“超类”中。但我不知道如何实现这一点。也许有一种方法可以在运行时动态构建设置器?或者也许还有其他我没有想到的方法?

如果有人能想到这个问题的解决方案,我会很高兴听到这个消息。

提前致谢!

编辑:

我不得不撤销已接受的答案(通过 动态创建 getter 和 setter Object.defineProperty),因为虽然我认为它可以解决我的问题,但实际上并没有。现在,当通过触发 setter 的直接属性分配更改属性时,我会收到通知,例如:

SynchronizedObject.importantProp = 'someValue';

但正如我注意到的,在许多情况下,这importantProp是一些更复杂的对象。这些对象通常是通过getter而不是 setter 更新的。

SynchronizedObject.importantProp.x = 'someValue';

据我所知,我没有机会注意到动态 getter/setter 实现以这种方式完成的更改。要使用它,我必须改变访问对象的方式。有效的东西:

prop = SynchronizedObject.importantProp;
prop.x = 'someValue';
SynchronizedObject.importantProp = prop;

这样,使用了 setter 并且一切正常。但这感觉真的很尴尬,我不想每次都考虑同步,我设置了一个属性。所以在我看来,该解决方案并不是真正可用的。

任何人都可以帮忙吗?

4

3 回答 3

2

一个set功能怎么样?

MyObj.prototype.set = function(key, value) {
    this[key] = value;
    // do other things
};

您可以将其与EventEmitter 实现结合起来,以便于观察更改。

于 2013-03-08T17:53:42.643 回答
1

这正是__defineSetter()__旨在支持的内容。查看 John Ressig 的JavaScript Getters and Setters博客文章,了解一些很好的示例。从 setter 内部触发事件非常简单。

于 2013-03-08T23:04:54.743 回答
0

如果轮子改造不是您真正的包包,您可能需要考虑MeteorJS 框架。

于 2013-03-08T17:56:09.910 回答