我正在开发一个带有服务器端组件的 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 并且一切正常。但这感觉真的很尴尬,我不想每次都考虑同步,我设置了一个属性。所以在我看来,该解决方案并不是真正可用的。
任何人都可以帮忙吗?