2013-03-08 77 views
1

我正在使用服务器端组件处理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; 

这样,设置器使用,并且一切顺利的罚款。但是这感觉非常尴尬,我不想每次都想同步,我设置了一个属性。因此,在我看来,解决方案并不是真的可用。

任何人都可以帮忙吗?

+0

当你说“setter方法”时,你的意思是另一个函数还是真正的访问器?你会好吗[Object.defineProperty](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)?旧版浏览器不支持,但您已经在使用画布... – bfavaretto 2013-03-08 17:59:51

回答

2

一个set函数怎么样?

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

你可以用EventEmitterimplementation结合这可以很容易地观察到的变化。

1

这正是__defineSetter()__打算支持的。查看John Ressig的JavaScript Getters and Setters博客文章,了解一些很好的例子。从一个设置者内部发起一个事件将非常简单。

+0

已弃用,您应该使用['Object.defineProperty'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/ Global_Objects/Object/defineProperty)。 – bfavaretto 2013-03-11 17:46:53