我正在尝试为全局浏览器窗口对象创建代理。这个想法很简单 - 如果调用者使用现有的方法或属性只返回它,否则使用虚假对象。这是代码:
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'值是代理的值,而不是窗口。 有没有办法让这个工作?
答案 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
};
},
};