You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebSocket代理的toString方法返回值与预期不符问题咨询

问题原因分析

你遇到的问题核心是函数调用时的this绑定问题,以及内置Function.prototype.toString的特殊行为:

  • 首先,WebSocket本身并没有自有toString方法,它的toString是从Function.prototype继承来的。
  • 当你调用unsafeWindow.WebSocket.toString()时,虽然Proxy的get陷阱返回了target[p](也就是Function.prototype.toString),但这个方法执行时,this绑定的是代理对象,而非原始的WebSocket构造函数。
  • 内置的Function.prototype.toString会根据调用时的this生成字符串:如果this是代理对象,它会返回代理的默认字符串表示,而不是原始目标函数的字符串。
解决方案

修改Proxy的get陷阱,确保toString方法执行时this指向原始的WebSocket:

方式一:直接绑定this到原始目标

console.log(WebSocket.toString());
unsafeWindow.WebSocket = new Proxy(WebSocket, {
    get(target, p, receiver) {
        const value = target[p];
        if (p === 'toString') {
            return value.bind(target);
        }
        return value;
    }
});
console.log(unsafeWindow.WebSocket.toString());

方式二:通用化处理(适配所有继承方法)

使用Reflect.get并指定receiver为原始目标,确保所有继承来的方法执行时this都指向原始对象:

console.log(WebSocket.toString());
unsafeWindow.WebSocket = new Proxy(WebSocket, {
    get(target, p, receiver) {
        return Reflect.get(target, p, target);
    }
});
console.log(unsafeWindow.WebSocket.toString());

两种方式都能让toString方法返回原始WebSocket的字符串结果。

内容的提问来源于stack exchange,提问作者An Mini Scripter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:05:26