我需要代理一个用
window.open
打开的窗口对象。
据我了解(这不太好),这里的琐碎“处理程序”实际上应该是身份操作,通过未修改的属性访问传递:
let origOpen = window.open;
window.open = function(url) {
let openedWindow = origOpen.apply(this, arguments);
let handler = {
get(target, prop, receiver) {
return Reflect.get(...arguments);
}
};
let wrappedWindow = new Proxy(openedWindow, handler);
return wrappedWindow;
};
let wi = window.open("https://example.net/");
console.log(wi.closed);
但是,当此脚本到达尝试记录
wi.closed
的行时,它会抛出以下异常:
Uncaught TypeError: 'get closed' called on an object that does not implement interface Window.
(使用 Firefox ESR 115。)
不幸的是,本机对象通常不支持在其代理版本上调用其方法和 getter/setter,您应该通过正确的绑定自行调用它们。这里 getter
closed
属于 window
在其他情况下它可能属于实例的原型(在原型链中的任何位置):
let origOpen = window.open;
window.open = function(url) {
let openedWindow = origOpen.apply(this, arguments);
let handler = {
const desc = Object.getOwnPropertyDescriptor(target, prop);
if(desc.get){
return desc.get.call(target);
}
return Reflect.get(...arguments);
};
let wrappedWindow = new Proxy(openedWindow, handler);
return wrappedWindow;
};
let wi = window.open("https://example.net/");
console.log(wi.closed);