2017-10-14 6 views
2

とを適切にサブクラス約束たくさんの記事がサブクラス化を避けることをお勧めかかわらず、それは約束のようなネイティブ、ビルトインクラスになると、それはどのように通常ES6クラスを使用してバベルとES6

class A extends B { /*...*/ } 

のような複合クラスに非常に簡単です。バベル自体は、かなりの痛みを感じません。such use cases。サブクラス化を正しく正常化するか、以下の例を調整することさえ可能ですか?私はES2015 presetでロールアップを使用しても、時にはReflect.constructの組み合わせを使用することによって回避することができES5での組み込みクラスの継承のための障害物がありますが、私の.babelrc

class P extends Promise { 
    foo(func) { 
    return this.then(func) 
    } 
    static bar(a) { 
    return a 
    } 
} 
+0

約束をサポートしているブラウザの多くは、ES6クラスもサポートしているので、おそらく単純にそれらをトランケイルする必要はありません。 – Bergi

+1

好奇心が強い、なぜあなたは 'Promise'をサブクラス化したいですか?私はそれの良いユースケースを見たことがない。 – Bergi

+0

あなたは何を達成しようとしていますか? – guest271314

答えて

1

でパイプに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サブクラスの好ましい代替案です。

関連する問題