如何将使用“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();
我正在尝试修改实例对象的行为以进行测试。如果您需要确切地知道我想要达到的目标,那就是:
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();