Tôi có một lớp thực hiện giao diện XMLHttpRequest. Tùy thuộc vào URL được chuyển đến open()
, tôi có thể xác định xem có nên sử dụng XMLHttpRequest mặc định hay triển khai tùy chỉnh của tôi hay không. Ý tưởng của tôi là sử dụng một proxy để làm điều này:Có thể thay đổi mục tiêu của Proxy không?
let xhr = new XHRProxy();
xhr.open('GET', 'http://blah'); // Decide here depending on URL
tôi đã làm một số xét nghiệm bằng cách sử dụng ES6 Proxy, mà có vẻ đầy hứa hẹn, nhưng tiếc là mục tiêu proxy không thể được sửa đổi sau khi xây dựng 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 :(
Tôi nghĩ rằng tôi có thể thực hiện những gì tôi muốn bằng cách không thiết lập mục tiêu - thay vào đó xác định tất cả các bẫy để ủy quyền cho đối tượng mong muốn - nhưng tôi hy vọng cho một giải pháp đơn giản hơn.
Lưu ý rằng bạn đang cố gắng thay đổi đích đã nhận thuộc tính '.switchToBar', chứ không phải gọi phương thức' .switchToBar() ' – Bergi
Vâng, nhưng tôi không nghĩ rằng nó quan trọng đối với ví dụ này. Và để sử dụng nó với XHR.open, tôi thực sự muốn thiết lập các đại biểu trước khi gọi thực hiện XHR.open. –