メソッド内から現在のオブジェクトと同じクラスの新しいオブジェクトを作成する方法

jfriend00

内部プロジェクトに使用しているArrayのサブクラスがあります。追加するメソッドのいくつかは、新しい配列を返す必要があります。その新しい配列を作成するための最良の方法を見つけようとしています。

特定のサブクラスの配列を作成するためにハードコーディングしたくありません。他の誰かが私のクラスをサブクラス化し、それがソース配列クラスである場合、そのサブクラスのオブジェクトを作成する必要があるためです。つまり、自分のthis下にサブクラスがいくつあっても、現在のオブジェクトと同じクラスの新しいオブジェクトを作成したいと思います

Arrayクラス自体はすでにこのようなことをしています。配列をサブクラス化して.map()から、サブクラスのインスタンスで通常の関数を使用すると、クラスを使用して新しい配列が返されます。

このためのECMAScript仕様は、その用途のためにここに.map()ありますArraySpeciesCreate().map()が、実際のJavascriptコードの観点から、この仕様ロジックがすべて何に変換されるのか理解できません。

現在、私は使用しています:

let newArray = new this.constructor();

それは私自身の小さな世界で機能しているようですが、そのすべてのロジックにArraySpeciesCreate()これよりも多くのコードが含まれるべきかどうか疑問に思っていますか?

参考ArraySpeciesCreate()までに、これ.map()は、返される新しい配列を作成するために従うことになっているECMAScript仕様からのものです。それは私がおそらく従おうとしていることでもあります。

ここに画像の説明を入力してください

これを自分のクラスに実装するために実際に使用するJavascriptコードは何ですか?


これが私のArrayサブクラスのメソッドの例です:

// break an array up into chunks
// the last chunk may have fewer items
// returns an array of arrays
chunk(chunkSize) {
    if (!Number.isInteger(chunkSize) || chunkSize <= 0) {
        throw new TypeError('chunkSize must be a positive integer');
    }
    const output = new this.constructor();
    const numChunks = Math.ceil(this.length / chunkSize);
    let index = 0;
    for (let i = 0; i < numChunks; i++) {
        output.push(this.slice(index, index + chunkSize));
        index += chunkSize;
    }
    return output;
}

そのメソッドの次のコード行:

const output = new this.constructor();

私が質問しているのは、ArraySpeciesCreate()ロジックを実装することになっているものです。

ベルギ

私はまだサブクラス化すべきではないとの意見を持っていますが、ECMAScriptで実装された場合にArrayどのようArraySpeciesCreateに見えるかを示すことができます。

if (!Array.isArray(this))               // if not called on an array
    return new Array(len);

const {constructor} = this;
if (typeof constructor == "function"    // if the constructor looks like a constructor,
  && !Function.prototype.isPrototypeOf(constructor) // but appears to stem from a
                                        // different realm (iframe etc)
  && constructor.name == "Array")       // and might be that realm's builtin Array
    return new Array(len);

const C = constructor?.[Symbol.species];
if (C == null)                          // if there's no subclass species
    return new Array(len);

return new C(len);

とにかく実際には正確に機能していない、レルム間インスタンスのテストの奇妙なエッジケースを除外できる可能性があります。(私はこれらをチェックする良い方法があります疑う、再現することは不可能と思われるGetFunctionRealm -多分あなたが投げるしたいのにステップをいくつか チェックするためにconstructorネイティブ関数です)。

一般に、それは単ににアクセスSymbol.speciesthis.constructor、新しいインスタンスを構築するために現在のクラスの代わりにその結果を使用することになります。

または、ごまかして使用することもできますArray.prototype.slice.call(this, 0, 0):-)

もう一つの良い解決策はある機能からES-抽象できるだけ正確として抽象的操作を実装しようとするライブラリー。ArraySpeciesCreate

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaの別のクラスからメソッド内にクラスオブジェクトを作成できないのはなぜですか?

分類Dev

`...`を使用して既存のオブジェクトから新しいオブジェクトを作成するときのエラー:この環境では、割り当てのソースはオブジェクトでなければなりません

分類Dev

そのクラスのメソッド内にクラスのオブジェクトを作成してもよいのはいつですか?

分類Dev

新しいオブジェクトを作成せずに他のクラスのメソッドを使用する方法

分類Dev

新しいオブジェクトを作成せずに他のクラスのメソッドを使用する方法

分類Dev

クラス内からのオブジェクトとメソッド内からのオブジェクトのメソッドの呼び出し

分類Dev

クラス内からのオブジェクトとメソッド内からのオブジェクトのメソッドの呼び出し

分類Dev

新しいオブジェクトを作成し、そのオブジェクトへの参照を返すC ++メソッドを実装する方法

分類Dev

C ++は同じクラスのメソッドでオブジェクトの型を返します

分類Dev

同じオブジェクトを返すクラスのジェネリックメソッド

分類Dev

selectLINQ句内とメソッド内で新しいオブジェクトを作成することの違いは何ですか

分類Dev

メインオブジェクトからオブジェクトの新しい配列を作成する方法

分類Dev

Perl:クラス内の同じオブジェクトを介してメソッドとjsonhashrefデータにアクセスする

分類Dev

Javascriptの同じオブジェクト内からsetTimeout関数を使用してオブジェクトメソッドを呼び出す

分類Dev

boolean equals()メソッドを使用して等しい同じクラスの2つのオブジェクト

分類Dev

新しいJavaResultsetオブジェクトを既存のオブジェクトに割り当ててから、元のResultSetオブジェクトを閉じると、新しく作成されたオブジェクトが閉じられますか?

分類Dev

Pythonは、同じオブジェクトメソッド内のリストにオブジェクトを追加します

分類Dev

同じクラスオブジェクト内のパラメータとしてクラスオブジェクトを使用する

分類Dev

新しいオブジェクトを作成し、同じタイプの古いオブジェクトからリスナーを保持する方法

分類Dev

別のオブジェクトクラスメソッドからオブジェクトとそのメソッドを呼び出す

分類Dev

同じライブラリ内の異なるクラスからメソッドを呼び出す、オブジェクト参照に関するエラー

分類Dev

クラスでPythonメソッドを使用して変数をチェックすると、別のクラスオブジェクトでも同じです。

分類Dev

Perlで複数のオブジェクトを作成し、同じメソッドにアクセスするにはどうすればよいですか?

分類Dev

構成と見なされるメソッド内の別のクラスからオブジェクトを作成しますか

分類Dev

同じオブジェクトのメソッド内からオブジェクトプロパティを作成する方法はありますか?

分類Dev

同じクラスから複数のオブジェクトを作成する

分類Dev

オブジェクト内のオブジェクトまたはオブジェクトと等しいオブジェクトはJavaScriptで同じですか?

分類Dev

ノードクラスメソッド内から新しいオブジェクトを作成する

分類Dev

同じノートブック内の異なるセルのクラスからクラスオブジェクトを作成する

Related 関連記事

  1. 1

    Javaの別のクラスからメソッド内にクラスオブジェクトを作成できないのはなぜですか?

  2. 2

    `...`を使用して既存のオブジェクトから新しいオブジェクトを作成するときのエラー:この環境では、割り当てのソースはオブジェクトでなければなりません

  3. 3

    そのクラスのメソッド内にクラスのオブジェクトを作成してもよいのはいつですか?

  4. 4

    新しいオブジェクトを作成せずに他のクラスのメソッドを使用する方法

  5. 5

    新しいオブジェクトを作成せずに他のクラスのメソッドを使用する方法

  6. 6

    クラス内からのオブジェクトとメソッド内からのオブジェクトのメソッドの呼び出し

  7. 7

    クラス内からのオブジェクトとメソッド内からのオブジェクトのメソッドの呼び出し

  8. 8

    新しいオブジェクトを作成し、そのオブジェクトへの参照を返すC ++メソッドを実装する方法

  9. 9

    C ++は同じクラスのメソッドでオブジェクトの型を返します

  10. 10

    同じオブジェクトを返すクラスのジェネリックメソッド

  11. 11

    selectLINQ句内とメソッド内で新しいオブジェクトを作成することの違いは何ですか

  12. 12

    メインオブジェクトからオブジェクトの新しい配列を作成する方法

  13. 13

    Perl:クラス内の同じオブジェクトを介してメソッドとjsonhashrefデータにアクセスする

  14. 14

    Javascriptの同じオブジェクト内からsetTimeout関数を使用してオブジェクトメソッドを呼び出す

  15. 15

    boolean equals()メソッドを使用して等しい同じクラスの2つのオブジェクト

  16. 16

    新しいJavaResultsetオブジェクトを既存のオブジェクトに割り当ててから、元のResultSetオブジェクトを閉じると、新しく作成されたオブジェクトが閉じられますか?

  17. 17

    Pythonは、同じオブジェクトメソッド内のリストにオブジェクトを追加します

  18. 18

    同じクラスオブジェクト内のパラメータとしてクラスオブジェクトを使用する

  19. 19

    新しいオブジェクトを作成し、同じタイプの古いオブジェクトからリスナーを保持する方法

  20. 20

    別のオブジェクトクラスメソッドからオブジェクトとそのメソッドを呼び出す

  21. 21

    同じライブラリ内の異なるクラスからメソッドを呼び出す、オブジェクト参照に関するエラー

  22. 22

    クラスでPythonメソッドを使用して変数をチェックすると、別のクラスオブジェクトでも同じです。

  23. 23

    Perlで複数のオブジェクトを作成し、同じメソッドにアクセスするにはどうすればよいですか?

  24. 24

    構成と見なされるメソッド内の別のクラスからオブジェクトを作成しますか

  25. 25

    同じオブジェクトのメソッド内からオブジェクトプロパティを作成する方法はありますか?

  26. 26

    同じクラスから複数のオブジェクトを作成する

  27. 27

    オブジェクト内のオブジェクトまたはオブジェクトと等しいオブジェクトはJavaScriptで同じですか?

  28. 28

    ノードクラスメソッド内から新しいオブジェクトを作成する

  29. 29

    同じノートブック内の異なるセルのクラスからクラスオブジェクトを作成する

ホットタグ

アーカイブ