2013-03-08 54 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