在javascript中,我可以使用foo
检测何时设置了全局变量Object.defineProperty
(假设它最初是未定义的):
var foo_;
Object.defineProperty(window, 'foo', {
get: function() {
return foo_;
},
set: function(newFoo) {
console.log('foo set to ' + newFoo);
foo_ = newFoo;
}
});
有更优雅的方法吗?一个缺点是我不能两次在同一财产上调用Object.defineProperty
。覆盖整个属性只是为了检测它何时被定义似乎有点矫枉过正。
我可以以某种方式使用proxies吗?我觉得我必须制作一个以窗口对象为目标的代理,虽然......效率很高吗?
答案 0 :(得分:0)
有更优雅的方法吗?
不是真的。也许你可以(应该)隐藏_foo
而不是创建另一个全局变量。
一个缺点是我不能两次在同一财产上调用
Object.defineProperty
。覆盖整个属性只是为了检测它何时被定义似乎有点矫枉过正。
唯一的问题是你忘了pass the configurable: true
option。
我可以以某种方式使用代理吗?
没有。您无法使用代理替换全局对象。您唯一能做的就是将所有代码包装在with (new Proxy(…)) { … }
块中。
答案 1 :(得分:-2)
您可能也喜欢
var _bar;
window.__defineGetter__("bar", function(){return this._bar});
window.__defineSetter__("bar", function(v){console.log("bar set to:",v); this._bar = v;});