2010-05-03 29 views
10

Spider-Monkey JavaScript引擎爲JavaScript對象實現__noSuchMethod__回調函數。在JavaScript中捕獲對未定義屬性的訪問

只要JavaScript嘗試執行對象的未定義方法,就會調用此函數。

我想設置一個回調函數給一個對象,當對象中的一個未定義的屬性被訪問或分配給它時,這個對象將被調用。

我還沒有找到爲JavaScript對象實現的__noSuchProperty__函數,我很好奇是否有任何解決方法可以實現相同的結果。

考慮下面的代碼:

var a = {}; 
a.__defineGetter__("bla", function(){alert(1);return 2;}); 
alert(a.bla); 

它相當於[alert(1);alert(2)] - 儘管a.bla是不確定的。

我想達到同樣的效果,但對未知屬性(即事先不知道一個。「BLA」將成爲訪問的屬性)

回答

4

在ECMAScript中的下一個版本,它應該是很容易的,使用Object.observe 在這裏閱讀更多: http://addyosmani.com/blog/a-few-new-things-coming-to-javascript/

+0

謝謝摩西。接受了這個答案,因爲它解決了原來的問題。 – avri 2012-11-26 07:33:43

+1

這個答案沒有解決問題。你正在尋找的功能被稱爲['代理',它不會很快實施](http://stackoverflow.com/q/6429521/1269037)。 – 2014-02-22 11:58:58

2

我想一個回調函數設置爲當Object中的未定義屬性被訪問或分配給對象時將被調用。

雖然這不是一個詳盡的答案,請記住,分配給對象的未定義屬性是JavaScript語言的一個關鍵特性。

另請注意,由Mozilla的JavaScript引擎實現的__noSuchMethod__is a non-standard method。 Google Chrome的V8引擎中有一個open feature request,但據我所知,這在其他瀏覽器中不受支持。

由於2014年2月的,It looks like this won't be supported any time soon.

+0

感謝您的答更新 - 我應該改進我的問題,如下所示: 有沒有辦法在Spider-Monkey JavaScript引擎中做同樣的事情? – avri 2010-05-03 06:44:27

+0

@avri:SpiderMonkey支持'noSuchMethod',但我懷疑你會發現一個內置的方法來捕獲嘗試分配給未定義屬性的嘗試,因爲這些實際上是該語言的特徵。 – 2010-05-03 06:46:56

+1

我不認爲將一個對象的未定義屬性賦值爲JavaScript語言的一個關鍵特性的事實應該很重要 - 事實上,JavaScript提供了__defineGetter__和__defineSetter__方法。 請考慮以下代碼: var a = {}; a .__ defineGetter __(「bla」,function(){alert(1); return 2;}); alert(a.bla); 它相當於[alert(1); alert(2)] - 即使a.bla未定義。 我想達到相同的結果,但未知屬性(即事先不知道a。「bla」將會被訪問) – avri 2010-05-03 06:49:59

2

向上,傢伙,我認爲我們需要把票投給在谷歌V8問題清單此功能,在這裏http://code.google.com/p/v8/issues/detail?id=264

似乎沒有太多關注這個非常重要的特點。:(

+0

[V8開發團隊不關心它](http://stackoverflow.com/q/6429521/1269037)。 – 2014-02-22 12:00:40