如何检测javascript中何时设置全局变量?

时间:2016-08-04 05:30:28

标签: javascript ecmascript-6

在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吗?我觉得我必须制作一个以窗口对象为目标的代理,虽然......效率很高吗?

2 个答案:

答案 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;});