使用內置javascript對象的一個簡單示例: navigator.my_new_property =「some value」;//我們可以檢測到這個新的屬性被添加?檢測何時將新屬性添加到Javascript對象?
我不想經常輪詢對象以檢查新屬性。 是否有某種類型的更高級別的對象而不是顯式指定要監視的屬性?
同樣,我不想檢測屬性值是否更改,而是添加新屬性時。
想法? 謝謝
使用內置javascript對象的一個簡單示例: navigator.my_new_property =「some value」;//我們可以檢測到這個新的屬性被添加?檢測何時將新屬性添加到Javascript對象?
我不想經常輪詢對象以檢查新屬性。 是否有某種類型的更高級別的對象而不是顯式指定要監視的屬性?
同樣,我不想檢測屬性值是否更改,而是添加新屬性時。
想法? 謝謝
沒有。確定財產何時寫入的現有方法:
defineProperty(obj, name, fn)
定義;__defineSetter__(name, fn)
定義的傳統JavaScript設置器;watch(name, fn)
;都是基於名稱的,所以無法捕獲正在寫入的以前未知名稱的新屬性。在任何情況下,navigator
都可能是「主機對象」,因此您不能依賴其上可用的任何普通JavaScript Object
接口。
輪詢或提供回調的顯式setter方法就是你所能做的。
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"
這將登錄每個屬性更改,但添加額外的if語句將執行此項工作。 [小提琴](https://jsfiddle.net/apt1e1a9/4/)謝謝 – dwonisch 2018-03-07 19:42:13
感謝您的詳細響應。 如果我去投票路線,你認爲什麼是一個很好的時間間隔在毫秒?很顯然,我希望它能夠有效,但不會不必要地重複。是否有一些框架用於輪詢的「標準」間隔? 建議表示讚賞。 – UICodes 2010-05-05 18:43:30
我認爲這將取決於你準備做什麼;沒有人回答。你在投票什麼對象,你期望它改變多少次,有多少其他屬性被定義在它上面?雖然你可以在現代桌面瀏覽器上以非常小的間隔(例如50毫秒)離開,但對於像IEMobile6這樣的弱瀏覽器上的人口衆多的對象,它可能會讓它癱瘓!順便說一下,對於像'navigator'這樣的主機對象,甚至不能保證設置任何新屬性,或者使用'for ... in'來迭代它們,都可以工作! :-S – bobince 2010-05-05 19:25:57
您已經無法捕獲許多託管對象的屬性更改(例如,嘗試定義各種DOM對象屬性上的getter/setting),所以我沒有看到提供一個通用對象更改通知程序的問題原因。 – Michael 2014-06-28 02:24:09