如何覆盖 WebSocket onmessage 事件

时间:2021-05-07 14:06:17

标签: javascript websocket

一个应用程序使用 websocket onmessage() 事件来解析 websocket 响应消息。我想实时看到,websocket 响应数据在控制台接收到应用程序。

所以我想以下列方式覆盖 websocket“消息”方法 /onmessage 事件。

How to override WebSocket send() method

“发送”覆盖有效,但“消息”无效。

WebSocket.prototype.oldmessage = WebSocket.prototype.message;
WebSocket.prototype.message = function(data) {
     console.log("ws: received data " + data);
     WebSocket.prototype.oldmessage.apply(this, [data]);
};

而且这也不起作用

if (WebSocket.prototype.onmessage) {
    (function() {
         var old_handler = WebSocket.prototype.onmessage;
         WebSocket.prototype.onmessage = function() {
            console.log('hii')
            old_handler.apply(this, arguments);
         };
    }());
}

1 个答案:

答案 0 :(得分:0)

你看到 onmessage 是一个带有 get 和 set 方法的属性,其中 send 只是一个你可以覆盖的方法,似乎没有简单的方法来覆盖 getter 和 setter,这里要考虑的另一件事是 Websocket.prototype 是不可扩展,您不能向原型添加新属性(尽管您可以更新)。 你可以做这样的事情

window.onmessagegetter = Object.getOwnPropertyDescriptor(WebSocket.prototype, 'onmessage').get;
window.onmessagesetter = Object.getOwnPropertyDescriptor(WebSocket.prototype, 'onmessage').set;
Object.defineProperty(window.WebSocket.prototype, 'onmessage', {
  get() {
    logger.log('getCalled');
    return window.onmessagegetter.apply(this);
  },
  set() {
    logger.log('setCalled');
    return window.onmessagesetter.apply(this, arguments);
  }
});