2010-05-05 106 views
9

使用內置javascript對象的一個​​簡單示例: navigator.my_new_property =「some value」;//我們可以檢測到這個新的屬性被添加?檢測何時將新屬性添加到Javascript對象?

我不想經常輪詢對象以檢查新屬性。 是否有某種類型的更高級別的對象而不是顯式指定要監視的屬性?

同樣,我不想檢測屬性值是否更改,而是添加新屬性時。

想法? 謝謝

回答

6

沒有。確定財產何時寫入的現有方法:

  • ECMAScript 5 setter使用defineProperty(obj, name, fn)定義;
  • 使用__defineSetter__(name, fn)定義的傳統JavaScript設置器;
  • a legacy Netscape/Mozilla watch(name, fn);

都是基於名稱的,所以無法捕獲正在寫入的以前未知名稱的新屬性。在任何情況下,navigator都可能是「主機對象」,因此您不能依賴其上可用的任何普通JavaScript Object接口。

輪詢或提供回調的顯式setter方法就是你所能做的。

類似的情況:Getter/setter on javascript array?

+0

感謝您的詳細響應。 如果我去投票路線,你認爲什麼是一個很好的時間間隔在毫秒?很顯然,我希望它能夠有效,但不會不必要地重複。是否有一些框架用於輪詢的「標準」間隔? 建議表示讚賞。 – UICodes 2010-05-05 18:43:30

+0

我認爲這將取決於你準備做什麼;沒有人回答。你在投票什麼對象,你期望它改變多少次,有多少其他屬性被定義在它上面?雖然你可以在現代桌面瀏覽器上以非常小的間隔(例如50毫秒)離開,但對於像IEMobile6這樣的弱瀏覽器上的人口衆多的對象,它可能會讓它癱瘓!順便說一下,對於像'navigator'這樣的主機對象,甚至不能保證設置任何新屬性,或者使用'for ... in'來迭代它們,都可以工作! :-S – bobince 2010-05-05 19:25:57

+0

您已經無法捕獲許多託管對象的屬性更改(例如,嘗試定義各種DOM對象屬性上的getter/setting),所以我沒有看到提供一個通用對象更改通知程序的問題原因。 – Michael 2014-06-28 02:24:09

1

ES6介紹代理的概念: es6 proxies on MDN

下面是一個簡單的例子:

let objectToSpy = {}; 
let handler = { 
    set: (target, prop, value)=>{ 
     console.log('new prop:', prop); 
     target[prop] = value; 
    } 
}; 

let proxy = new Proxy(objectToSpy,handler); 
proxy.testProp = 'bla'; //prints: "new prop: testProp" 
+0

這將登錄每個屬性更改,但添加額外的if語句將執行此項工作。 [小提琴](https://jsfiddle.net/apt1e1a9/4/)謝謝 – dwonisch 2018-03-07 19:42:13