2017-11-16 9 views
2

、私たちすることができますArrayのような最終的には、サブクラス組み込みコマンド:組み込み関数をサブクラス化するときにコンストラクタの仮関数をオーバーライドすることは安全ですか? ES6で

class Bar extends Array { 
    ... 
} 

特別何もせずに、彼らは彼らのコンストラクタを見ているので、通常、Barを通じて呼び出されたときBarインスタンスを返しますArrayインスタンスを返しますArray方法機能はSymbol.speciesです。

今、Barのカスタムコンストラクタ関数を定義しました。 にどのようにの静的およびメンバーメソッドArrayのように彼らはSymbol.speciesを参照してコンストラクタを呼び出しますか?要するに、Arrayのような組み込み関数のサブクラスにユーザー定義のコンストラクタを提供するのは安全ですか?

答えて

2

Arrayの静的メソッドとメンバメソッドがコンストラクタを呼び出す方法については保証はありますか?

はい、正しく指定されています。具体的には、すべてのプロトタイプメソッド(slice,concat,map,filter)は、1つの引数、つまり整数長のコンストラクタを呼び出すアブストラクトArraySpeciesCreate algorithmを使用します。 Array.ofArray.fromは非常によく似ていますが、後者はイテレータから配列を作成するときに長さを渡しません。

concatslicefromofも明示的にmapfilterにはない、要素を割り当てた後lengthプロパティを設定します。

+0

仕様では、もう一度。私はもっ​​と頻繁にチェックするべきだと思います! – Textfield

+1

TBH、ちょうど6つのメソッドであっても、その動作は驚くほど矛盾しています。たぶん私は問題を提出する必要があります。 – Bergi

関連する問題