2014-10-04 38 views
0

我寫了一個answer,我不得不寫一些裝飾器,這樣我就可以掛鉤一些函數調用。但是,我也想要掛鉤屬性setter調用,但我不知道如何做到這一點。如何爲動態屬性編寫裝飾器?

在答案中,我想鉤入localStorage,以便我可以聽取任何更改。我通過裝飾setItem()removeItem()函數來完成此操作。

我知道我可以通過創建新的,在某些時候調用原件來裝飾功能。

var _setItem = localStorage.setItem; 
localStorage.setItem = function() { 
    _setItem.apply(this, arguments); 
    localStorageObserver.notifySubscribers(arguments[0]); 
}; 

這工作的很好,但還有其他用途,我希望掛鉤,財產訪問。以下是所有等價物的存儲對象:

localStorage.setItem('someProperty', 'value'); 
localStorage.someProperty = 'value'; 
localStorage['someProperty'] = 'value'; 

所以我需要掛接到最後兩種情況,但我不知道如何可以完成。

如何爲動態屬性編寫裝飾器?這是否可能?

我想我可以手動創建屬性,因爲它們被設置爲隱藏存儲對象完成的工作,但這看起來不是很有伸縮性。如果有一個簡單的setProperty(name, value)函數可以插入,我可以修飾它。但據我所知,這並不存在。

+0

'localStorage.key'說這是一個函數 – loveNoHate 2014-10-04 09:10:48

+1

對不起,不好的例子。 – 2014-10-04 09:12:29

+0

;)............. – loveNoHate 2014-10-04 09:14:58

回答

0

如何爲動態屬性編寫裝飾器?這是否可能?

由於ES5的,與真正的JavaScript對象,你可以裝飾的屬性,你可以找到的名字,而不是那些你還不知道的名字,用一個getter/setter方法對通過更換物業Object.defineProperty。在ES6中,可以創建「代理」,允許您在現有對象的前面完全放置外觀,即使您的名稱尚不知道的proeprties也會攔截get/set,前提是您允許替換與門面的對象。

在ES5的情況下,所討論的對象必須是一個真正的JavaScript對象,並且不能保證主機提供的對象如localStorage。在ES6的情況下,您必須能夠用自己的外觀對象覆蓋localStorage,但由於localStorage是由主機提供的,因此無法保證您有足夠的理由相信您不會被允許(並嘗試過)在Chrome上,你不能在Chrome上)。

+0

我可以忍受這一點。至少在一個門面對象的情況下,我可以說,如果你想充分利用正在添加的功能,你必須使用門面。我認爲在這種情況下這是合理的。 – 2014-10-10 20:35:23