在 Safari 中扩展本机 (es6) 类的问题

Lar*_*man 9 javascript safari prototype ecmascript-6 es6-class

我在WebSocket使用 es6 类扩展本机类时遇到问题。

以下代码适用于 Chrome 和 Firefox,但不适用于 Safari:

class MyWebSocket extends WebSocket {
    doSomething() {
        console.log('hi');
    }
}

let ws = new MyWebSocket('wss://127.0.0.1:4000');
ws.doSomething();
Run Code Online (Sandbox Code Playgroud)

类型错误:ws.doSomething 不是函数。(在 'ws.doSomething()' 中,'ws.doSomething' 未定义)

console.log('MyWebSocket.prototype')让我看到该功能已添加到原型中。其他一些内置类会发生这种情况,Animation它们是一个,但不会发生在其他类中Date,例如。

有没有人遇到过这个?这是 Safari 中的错误吗?任何建议表示赞赏!

geo*_*org 8

是的,看起来像一个错误。该WebSocket构造可能是硬编码返回一个WebSocket实例。也不尊重Symbol.species

作为一种解决方法,您可以使用以下方法:

class MyWebSocket extends WebSocket {
    constructor(url) {
        super(url);
        Object.setPrototypeOf(this, MyWebSocket.prototype);
    }
Run Code Online (Sandbox Code Playgroud)

  • 至少 Safari 中的 URL 类似乎也有同样的问题。这个黑客成功了。 (2认同)
  • “Request”和“Response”对象也是如此。该修复也适用于这些。 (2认同)