如何将使用“this”的函数附加到实例对象

How to attach function that uses `this` to instance-object

我正在尝试修改实例对象的行为以进行测试。如果您需要确切地知道我想要达到的目标,那就是:

const fakeWebSocket$$: WebSocketSubject<any> = new Subject<any>() as WebSocketSubject<any>;
fakeWebSocket$$.multiplex = (x: any, y: any, filterFn: (z: any) => boolean) => 
    fakeWebSocket$$.pipe(filter(filterFn));

将伪造的 multiplex 方法附加到 RxJS-Subject 以便能够模拟 WebSocketSubject.

这很好用,但请注意我必须引用 fakeWebSocket$$ 两次:

// simplified for readability
fakeWebSocket$$.multiplex = (x, y, filterFn) => fakeWebSocket$$.pipe(filter(filterFn));

我希望有一种方法可以将对 fakeWebSocket$$ 的第二次显式调用替换为 this,不知何故?

为了能够使用 this,您必须将箭头函数重写为普通的 function 函数:

fakeWebSocket$$.multiplex = function (x, y, filterFn) {
  return this.pipe(filter(filterFn));
};

此用法未记录,但应该有效。

然而,

The documentation 的编写方式建议创建派生的 class 来覆盖 multiplex(),而不是直接向实例分配新值:

class FakeSubject<T> extends WebSocketSubject<T> {
  override multiplex(
    subMsg: () => any,
    unsubMsg: () => any,
    messageFilter: (value: T) => boolean
  ) {
    return this.pipe(filter(messageFilter));
  }
}

const fakeWebSocket$$ = new FakeSubject();