ツリー構造のデータは、一部のライブラリを作成するときによく使用されます。また、一部のツリー構造のデータには、ルートからリーフまでのパスを取得するための非常に高い要件があります。たとえば、サイトのルーティング テーブル全体がそのようなツリーであり、その「パス」は実際には URL のパス部分です。そこで、私はそれを実装するためにクレイジーな配列継承を何度か使用しました。以下にそれを共有します。
JavaScript では、配列もオブジェクトの一種であり、継承することもできます。任意の 2 つのオブジェクト自体は継承関係を持つことができ、配列も例外ではありません。そこで、ツリーの任意のノードを配列にし、最大の添え字を持つ要素の値のみを保持します。他の要素の値は、プロトタイプ継承を通じて祖先ノードから継承されます。このようにして、通常の配列を操作するのと同じように、ルート ノードからリーフ ノード上のパスにアクセスできます。以下は簡単な実装です:
を実行します
<script> // 定义节点类 var TNode = function(value) { this.push(value); }; TNode.prototype = []; TNode.prototype.constructor = TNode; TNode.prototype.createChild = function(value) { var node = Object.create(this); TNode.call(node, value); return node; }; // 使用节点造出一棵简单的树 var root = new TNode('root'); var a = root.createChild('a'); var b = a.createChild('b'); // 将叶节点视为数组,直接得到路径 document.write(b.join('/')); <!-- root/a/b </script>
この使用法は比較的闇の魔法と考えられており、プロトタイプ継承の原理を理解していないと理解するのが難しいかもしれません。したがって、単なるライブラリの実装であれば、このように書くことができますが(何度も使用して、落とし穴がないことがわかりました)、ビジネスコードで直接使用すると、クレームが来る可能性があります死に至るまで。ただし、この使用法は JavaScript 言語の核となる考え方に違反するものではありません。
この使用法の 1 つの特徴は、祖先ノードの値が更新されると、すべての子ノードに自動的に同期されることです。プロトタイプ チェーンにアクセスするときにパフォーマンスのオーバーヘッドもありますが、コード レベルでツリーを自分で走査するよりもはるかに高速です。もちろん、そのような需要がなく、単純な数値を実装したいだけの場合は、従来の方法を使用する方が良いでしょう。結局のところ、これは言語に依存しすぎており、将来的に他のプログラミング言語に移行するのは難しいかもしれません。