我正在使用服务器端组件处理JavaScript应用程序。目标是在画布上使多个不同的对象在多个浏览器之间同步(即,具有相同的外观)。同步由服务器端组件完成,该组件向所有浏览器广播单个更改。每当一个对象发生变化时,它都必须通知服务器哪些内容会通知其他浏览器。注意JavaScript对象属性更改的优雅方法
画布上的对象由其属性决定用户外观的JavaScript对象表示。当然,并不是所有的属性都对外观很重要。因此,只有重要属性的变化必须传输给其他浏览器。有不同的'类'对象,但所有的对象'从一个共同的'超类'继承'(我知道,类继承术语并不真正在JavaScript中工作,但在这种情况下,我认为这样更容易) 。
现在,我有一些麻烦,以优雅的方式发送客户端服务器通知。目前,我为不同对象的所有重要属性设置了setter方法。这些setter方法调用一个将通知发送到服务器的函数。
我不太喜欢这个解决方案,因为它引入了很多样板代码。理想情况下,当我创建一个新对象时,我希望能够指定重要的属性。负责监视这些属性变化的逻辑可能在'超类'中。但我不知道如何实现这一点。也许有一种方法可以在运行时动态构建setter?或者也许有其他方式我没有想过?
如果有人能想到这个问题的解决方案,我会很高兴听到它。
在此先感谢!
编辑:
我不得不(通过动态Object.defineProperty
创建getter和setter)吊销接受的答案,因为虽然我认为这将解决我的问题,它并没有真正。当属性是通过直接的属性分配时触发的setter,例如:
SynchronizedObject.importantProp = 'someValue';
改变了我现在就通知但正如我注意到,在许多情况下,importantProp
是一些更复杂的对象。而这些对象通常通过获取者更新,而不是设置者。
SynchronizedObject.importantProp.x = 'someValue';
就我所见,我没有机会注意到我的动态getters/setters实现以这种方式完成的更改。要使用它,我必须改变我访问我的对象的方式。一些作品:
prop = SynchronizedObject.importantProp;
prop.x = 'someValue';
SynchronizedObject.importantProp = prop;
这样,设置器使用,并且一切顺利的罚款。但是这感觉非常尴尬,我不想每次都想同步,我设置了一个属性。因此,在我看来,解决方案并不是真的可用。
任何人都可以帮忙吗?
当你说“setter方法”时,你的意思是另一个函数还是真正的访问器?你会好吗[Object.defineProperty](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)?旧版浏览器不支持,但您已经在使用画布... – bfavaretto 2013-03-08 17:59:51