我有一個實現XMLHttpRequest接口的類。根據傳遞給open()
的URL,我可以確定是使用默認的XMLHttpRequest還是使用我的自定義實現。我的想法是使用代理來做到這一點:是否可以更改代理的目標?
let xhr = new XHRProxy();
xhr.open('GET', 'http://blah'); // Decide here depending on URL
我沒有使用ES6代理,這似乎是有前途的一些測試,但不幸的是,代理目標無法構建代理後可以修改:
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()'方法 – Bergi
是的,但我不認爲這個例子很重要。爲了在XHR.open中使用它,實際上我想在調用XHR.open實現之前設置委託。 –