而不是专注于为什么,让我们专注于什么。
我想用一个名为WebSocketProxy的用户定义类替换本机WebSocket类。这样一来,当页面上的代码试图创建一个新的WebSocket时,它实际上会返回一个新的WebSocketProxy(我有我的理由)。
用它写的最简单的形式来测试这个:
class WebSocketProxy extends WebSocket {
constructor(url: string, protocols?: string | string[]) {
super(url, protocols);
/* Add hooks here. */
}
}
WebSocket = WebSocketProxy; // Swap native WebSocket with WebSocketProxy.
TypeScript编译器(Visual Studio 2015)将其转换为:
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var WebSocketProxy = (function (_super) {
__extends(WebSocketProxy, _super);
function WebSocketProxy(url, protocols) {
_super.call(this, url, protocols); // This is what causes the error.
/* Add hooks here. */
}
return WebSocketProxy;
})(WebSocket);
WebSocket = WebSocketProxy; // Swap native WebSocket with WebSocketProxy.
认为这肯定会奏效,当我把它复制到Firefox中的Scratchpad并执行时,我很失望。
TypeError:构造函数WebSocket需要' new'
在Chrome中执行相同操作时,我遇到了类似(但更有用)的错误:
未捕获的TypeError:无法构建' WebSocket':请使用' new'运算符,此DOM对象构造函数不能作为函数调用。
我在Edge或Internet Explorer中没有收到此错误。
这种行为让我感到疑惑:
答案 0 :(得分:2)
我应该如何制作我的伪WebSocket? (也许实现而不是扩展?)
您可以非常轻松地执行以下操作:
const OrigWebSocket = WebSocket;
WebSocket = function(url: string, protocols?: string | string[]){
const self = new OrigWebSocket(url,protocols);
/* Add hooks here. */
return self;
} as any;
这严格来说是Chrome / Firefox问题
铬/火狐
尝试扩展本机类型只是不好的做法,或者这是一个特殊情况
特例
为什么在Chrome和Firefox中禁止将WebSocket作为禁止使用的功能?
防止用户错误(WebSocket
表示new WebSocket(
)
这与https://github.com/sinonjs/sinon/issues/743非常相似,基本上用new
调用是非常吝啬的,所以不容易窥探。