TIL


JavaScriptでツリー構造を実現する際,混同した箇所を整理した.

クラスとインスタンスを完全に区別します。


  • 誤った思考部分
  • 上記のクラスにroot = new Tree(1)という名前のインスタンスが作成されたと仮定し、生成者の初期値が1になり、tree.add(2)になったとき、生成者の初期サブ配列にnewTree、すなわち新しいインスタンスが格納されたと考えられる.
    たとえばroot.add(1) root.add(2) root.add(3)完了したら、新しいインスタンスを作成すると、ジェネレータのサブ配列に保存されます.
    完全に思い違いをした.
    この写真は完璧ではありませんが、そう思うのは正しいと思います.

    classの作成者はそのままで、インスタンスを作成するたびにクラスに組み込まれたメソッドと作成者が付きます.したがって、インスタンスの作成後にどのように追加しても、クラスの作成者は影響を受けません.
    この考え方が生まれたのは,レプリケーションメソッドを作成しながらである.

    私の誤った理論に従って、上記のコードのインスタンスを作成して追加し、別のインスタンスを作成してcloneメソッドを実行する場合は、addの一部を含む必要があります.上記と同じことを言っていたのですが、この部分を混同してしまったので、かなり迷いました…インスタンスはクラスの内部機能を継承して作成されたオブジェクトにすぎず、クラス値を変更することはできません.
    そうすると、上のcloneメソッドも修正する必要があります.cloneで新しいnewTreeオブジェクトを作成すると、クラス内蔵機能を持つ新しいインスタンスしか生成されません.クラス値は絶対に変更されません.

    コピーするかどうかをテストすると、まったくコピーされず、新しいオブジェクトインスタンスのみが返されます.
    上記のコードをコピー方法に変換する場合は、このようにする必要があります.

    テストしてみましょうか?

    クローンメソッドを使用する場合、コピーであることを確認できます.
    cloneメソッドを実装する場合、let newTree = new Tree()の部分はジェネレータを直接受信してオブジェクトを作成するだけであるため、最初に作成したインスタンスの値とサブインスタンスの値をコピーするインスタンスに割り当てる必要があります.
    newTree.value = this.value
    newTree.children = this.children
    次に、コピーしたインスタンスをリカバリします.
    このように一字一句書いていると、いつの間にかもっと完璧に理解されているようです.