でパイプにtransform-builtin-classesを試しています
PS回避策としてObject.setPrototypeOf
を使用してください。これはBabel transform-builtin-classes
によって使用される方法です。
このメソッドが適用できるかどうかは、組み込みクラスの動作方法によって異なります。 Promise
の場合、これはビルトインから継承する追加の中間クラスを必要とする場合があり、通常のを使用して継承できます。
function _P(executor) {
return Reflect.construct(Promise, [executor], P);
}
Object.setPrototypeOf(_P, Promise);
_P.prototype = Object.create(Promise.prototype);
class P extends _P {
static bar(arg) {
return new this(resolve => resolve(arg));
}
foo(...fns) {
return this.then(...fns);
}
}
これはcorrect prototype chainを確立します。この方法の欠点は、それがさらに拡張するのが難しいP
サブクラスにハードコードされていることです。
これを行うよりきれいな方法は、中間クラスラップビルトインクラスインスタンスを作成することです。これは、中間クラスに元のクラスのAPIを複製するために必要ですが、それは小さいので、これは制限はありませんプロトタイプチェーンのための許容可能なトレードオフです:
function _P(executor) {
this._promise = new Promise(executor);
}
Object.setPrototypeOf(_P, Promise);
_P.prototype = Object.assign(
Object.create(Promise.prototype),
{
then(...args) {
return this._promise.then(...args);
},
...
}
);
class P extends _P { ... }
それは、この機能はすでに介して利用可能であることに注意すべきです既にmapSeries
を含むpromise ponyfillsです。追加の機能の恩恵を受けるためには、すべての本来の約束事をP
約束事に変換する必要があることを考慮して、自己完結型ヘルパー関数としてそれらを使用することは、一般的にP
サブクラスの好ましい代替案です。
約束をサポートしているブラウザの多くは、ES6クラスもサポートしているので、おそらく単純にそれらをトランケイルする必要はありません。 – Bergi
好奇心が強い、なぜあなたは 'Promise'をサブクラス化したいですか?私はそれの良いユースケースを見たことがない。 – Bergi
あなたは何を達成しようとしていますか? – guest271314