嗯,我試圖在Chrome中使用Object.watch
的polyfill時遇到了問題。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch https://gist.github.com/eligrey/384583Object.defineProperty在鉻devtool下看不見的道具
的填充工具是很短的一個,你可以看它是如何刪除原來的財產和馬上定義一個新的屬性相同的值,但覆蓋getter和setter。
的問題是,如果你使用這個填充工具和觀看o.p:
var o = { p: 1 };
o.watch("p", function (id, oldval, newval) {
console.log("o." + id + " changed from " + oldval + " to " + newval);
return newval;
});
之後,你檢查對象o
下鍍鉻devtool。砰!對象o
現在是空的!其實它仍然有p
,o.p
,你會發現o.p = 1
。
我的問題是,爲什麼該屬性在Chrome開發人員工具對象屬性列表下不可見?
注意:如果您不知道/感興趣的Object.watch
,您可能仍然可以幫助我解決這個問題,只要您明白Object.defineProperty
。
編輯:事實證明,它沒有像我認爲它創建一個新的屬性,只是重寫它的getter和setter。 引用來自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty 「存在於對象中的屬性描述符有兩種主要形式:數據描述符和訪問符描述符。數據描述符是一個具有值的屬性,該值可以是也可以不是可寫的。一個吸氣定位器對功能「。
因此,看起來polyfill將目標屬性從「數據屬性」更改爲「訪問器屬性」。我認爲這是唯一的方法來填充這個?
它不是不可見的,它由'watch'填充變爲'getter'和'setter'。這是'watch'知道它何時被修改的方式。 – Xotic750
Òk,如果你讀了代碼,你會看到它做了一個副本,刪除舊的屬性並重新添加該屬性作爲一個getter和setter舊值。 - >更改 – Xotic750
我可以看到它。 [jsfiddle](http://jsfiddle.net/Xotic750/FUJ5h/) – Xotic750