JavaScript 代理不适用于打开的 Window 对象

问题描述 投票:0回答:1

我需要代理一个用

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。)

javascript dom window.open javascript-proxy
1个回答
0
投票

不幸的是,本机对象通常不支持在其代理版本上调用其方法和 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);

© www.soinside.com 2019 - 2024. All rights reserved.