使用JS代理对象时保留'this'上下文

时间:2017-06-06 20:09:33

标签: javascript

我正在尝试为全局浏览器窗口对象创建代理。这个想法很简单 - 如果调用者使用现有的方法或属性只返回它,否则使用虚假对象。这是代码:

var handler = {
  get: function(target, name) {
    return name in window ?
      window[name] :
      target[name];
  },
  set: function(obj, prop, value) {
    if (prop in window) {
      window[prop] = value
    } else {
      obj[prop] = value
    };
  },
};

var fakeWindow = new Proxy(function() {}, handler);
fakeWindow.foo = 'bar';
console.log(fakeWindow.foo); // outputs 'bar'
fakeWindow.alert('hello'); // error - the alert method is called without the correct this value

问题是,当在代理对象上调用方法时(例如上面的例子中的alert),'this'值是代理的值,而不是窗口。 有没有办法让这个工作?

2 个答案:

答案 0 :(得分:1)

您可以绑定上下文:

get: function(target, name) {
if(name in window){
 if(typeof window[name]==="function") return window[name].bind(window);
 return window[name];
}
return target[name];
}

答案 1 :(得分:0)

基于Jonas w评论的解决方案:

var handler = {
  get: function(target, name) {
    return name in window ?
      (typeof window[name] == 'function' ? window[name].bind(window) : window[name]) :
      target[name];
  },
  set: function(obj, prop, value) {
    if (prop in window) {
      window[prop] = value
    } else {
      obj[prop] = value
    };
  },
};