【发布时间】:2016-11-16 18:32:19
【问题描述】:
我有一个实现 XMLHttpRequest 接口的类。根据传递给open() 的URL,我可以确定是使用默认的XMLHttpRequest 还是我的自定义实现。我的想法是使用代理来做到这一点:
let xhr = new XHRProxy();
xhr.open('GET', 'http://blah'); // Decide here depending on URL
我用 ES6 Proxy 做了一些测试,看起来很有希望,可惜构建了 Proxy 后代理目标无法修改:
var foo = {
name() {
return "foo";
}
};
var bar = {
name() {
return "bar";
}
}
var handler = {
get(target, property, receiver) {
if (property === "switchToBar") {
// FIXME: This doesn't work because a Proxy's target is not exposed AFAIK
receiver.target = bar;
return function() {};
} else {
return target[property];
}
}
}
var proxy = new Proxy(foo, handler);
console.log(proxy.name()); // foo
proxy.switchToBar();
console.log(proxy.name()); // foo :(
我认为我可以通过根本不设置目标来完成我想要的 - 而是定义所有陷阱以委托给所需的对象 - 但我希望有一个更简单的解决方案。
【问题讨论】:
-
请注意,您正在(尝试)在获取
.switchToBar属性时更改目标,而不是在调用.switchToBar()方法时 -
是的,但我认为这个例子并不重要。要将它与 XHR.open 一起使用,我实际上确实想在调用 XHR.open 实现之前设置委托。
标签: javascript xmlhttprequest ecmascript-6