RxJS 5 subclassing Observable - 静态方法 return 父实例 class

RxJS 5 subclassing Observable - static methods return instances of the parent class

我正在尝试通过 subclassing Observable 和重写 lift 方法来 subclass RxJS Observable class,如 here 所述。

这适用于我添加到原型中的任何运算符,但每当我尝试实例化我的子 class 的新 Observable 时(例如使用 MyObservable.from([1, 2, 3]) ,我得到了父对象的 Observable class。

如何正确地子 class Observable,以便使用 Observable.return / Observable.from / 能按预期工作? jsbin

class MyObservable extends Rx.Observable {
  lift(operator) {
    const observable = new MyObservable();
    observable.source = this;
    observable.operator = operator;
    return observable;
  }

  customOperator() {
    return this.map(arguments)
  }
}


// instantiating an observable with **MyObservable**.from
var observable = MyObservable.from([1, 2, 3]);
console.log('instance of Rx.Observable: ' + observable instanceof Rx.Observable);


// this works as map is defined on RxObservable
observable
  .map(value => console.log('standard ' + value)) 
  .subscribe();


// this doesn't work. customOperator is only defined on MyObservable
// and MyObservable.from([1, 2, 3]) returns an Rx.Observable instance
observable
  .customOperator(value => console.log('custom ' + value)) 
  .subscribe();    

我认为你不能那样做。你可能需要做一些猴子修补并做一些像

Observable.prototype.customOperator = /*blabla*/

这样所有子类化 Observable 都将拥有 customOperator。

我为此 here 提出了一个问题,结果发现目前没有解决方案。

一旦 this 提供 let 运算符的 PR 被合并,最干净的解决方案将是包装原始的可观察对象:

class MyObservable extends Observable {
  constructor(source) {
    this.source = source;
  }

  lift(operator) {
    const observable = new MyObservable(); //<-- important part here
    observable.source = this;
    observable.operator = operator;
    return observable;
  }
}


Observable.of(42)
  .let(o => new MyObservable(o))