2013-05-02 108 views
0

我希望能夠提供一個JavaScript函數,只要指定對象的任何屬性被查詢或更新,就會被調用。如果可能的話,那可能嗎?爲了舉個簡單的例子,如果我有obj = { a:3 },我希望有一些函數在任何代碼查詢obj.a時調用,並且能夠返回我想要的任何東西而不是其當前值,例如, 4而不是3.是否有可能在JavaScript中捕獲財產訪問權限?

回答

2

這很容易,你可以使用Object.prototype.defineProperty。更多關於它here

要回答你的問題:

var obj = {}; 
Object.defineProperty(obj, "a", { 
    get: function() {console.log("I've been accessed"); return 5;//or whatever value} 
}); 
console.log(obj.a) 

Working fiddle

更新

以上可以人手。

Object.prototype.addMonitoredGetter = function(property, value, callback) { 
    Object.defineProperty(this, property, { 
     writable: false, 
     get: function() {callback(); return this[property] 
    }; 
}; 

而這裏的回調可能是監控功能。當然,需要默認的參數和檢查,但它應該做到這一點。

+0

您可惜不能兼得的內在價值和getter/setter方法,讓你的二傳手代碼就會失敗,因爲它將遞歸調用自身,直到瀏覽器崩潰或代碼失敗。 – 2013-05-02 11:01:11

+0

是的,只有它纔會允許對財產訪問進行監控。儘管如此,它可能會讓很多物業煩人。 – 2013-05-02 11:11:53

+0

這聽起來很有趣,我會對它進行試驗......我想要做的是有一個可用的財產,但推遲計算它的價值,直到它是必需的(如果它是必需的)。是的,當然,這可以使用標準的getter函數來完成,但是我使用了一個依賴於直接查詢屬性的現有庫,因此這種方法。非常感謝您的幫助! – 2013-05-02 13:16:55

0

有適用於Firefox的手錶方法...

o.watch("p", function(...) 

+0

太棒了!不幸的是,它是非標準的,甚至在Chrome等其他現代JS引擎中都沒有支持。 – 2013-05-02 13:14:34

+0

是的,但無論如何要知道;) – Christian 2013-05-03 05:22:34

相關問題