Les données structurées en arborescence sont souvent utilisées lors de l'écriture de certaines bibliothèques, et certaines données structurées en arborescence ont des exigences très élevées pour obtenir le chemin de la racine à la feuille. Par exemple, la table de routage entière d'un site est une telle arborescence, et son « chemin » est en fait la partie chemin de l'URL. J'ai donc utilisé plusieurs fois l'héritage de tableaux fous pour l'implémenter, et je le partagerai avec vous ci-dessous.
En JavaScript, les tableaux sont également un type d'objet et peuvent également être hérités. Deux objets eux-mêmes peuvent avoir une relation d'héritage, et les tableaux ne font pas exception. Nous laissons donc n'importe quel nœud d'un arbre être un tableau, et il ne conserve que la valeur de l'élément avec le plus grand indice. Les valeurs des autres éléments sont héritées des nœuds ancêtres via l'héritage prototypique. De cette façon, nous pouvons accéder au chemin depuis le nœud racine vers le nœud feuille, tout comme nous exploitions un tableau normal. Voici une implémentation simple :
Courez
<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>
Cet usage est considéré comme une magie relativement sombre, et il peut être difficile à comprendre si vous ne comprenez pas le principe de l'héritage prototypique. Donc s'il ne s'agit que d'une implémentation d'une bibliothèque, elle peut être écrite comme ceci (je l'ai utilisée plusieurs fois, et il s'avère qu'il n'y a pas de piège), mais si elle est utilisée directement dans le code métier, elle peut être plainte à mort. Bien que cette utilisation ne viole pas l’idée fondamentale du langage JavaScript.
Une caractéristique de cette utilisation est que lorsque la valeur du nœud ancêtre est mise à jour, elle sera automatiquement synchronisée avec tous les nœuds enfants. Bien qu'il y ait également une surcharge de performances lors de l'accès à la chaîne de prototypes, cela est beaucoup plus rapide que de parcourir l'arborescence vous-même au niveau du code. Bien sûr, s'il n'y a pas une telle demande et que vous souhaitez simplement implémenter un numéro simple, il est préférable d'utiliser la méthode traditionnelle. Après tout, cela dépend trop du langage et il pourrait être difficile de migrer vers d'autres langages de programmation à l'avenir.