好吧,当我尝试Object.watch
在 Chrome 中使用 polyfill 时,我遇到了问题。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch
https://gist.github.com/eligrey/384583
polyfill 非常短,您可以阅读它如何删除原始属性并立即定义一个新属性,该值相同但具有覆盖 getter 和 setter。
问题是,如果你使用这个 polyfill 并观察 op:
var o = { p: 1 };
o.watch("p", function (id, oldval, newval) {
console.log( "o." + id + " changed from " + oldval + " to " + newval );
return newval;
});
之后,您检查o
chrome 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 “对象中的属性描述符有两种主要形式:数据描述符和访问器描述符。数据描述符是一个具有值的属性,该值可能是可写的,也可能是不可写的。访问器描述符是由 getter-setter 函数对描述的属性。
所以看起来 polyfill 将目标属性从“数据属性”更改为“访问器属性”。我认为这是填充这个的唯一方法?