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
相关产品推荐
相关产品推荐

