Beim Schreiben einiger Bibliotheken werden häufig baumstrukturierte Daten verwendet, und einige baumstrukturierte Daten stellen sehr hohe Anforderungen an den Pfad vom Stamm zum Blatt. Beispielsweise ist die gesamte Routing-Tabelle einer Site ein solcher Baum, und ihr „Pfad“ ist tatsächlich der Pfadteil der URL. Deshalb habe ich mehrmals die verrückte Array-Vererbung verwendet, um es zu implementieren, und ich werde es unten mit Ihnen teilen.
In JavaScript sind Arrays ebenfalls ein Objekttyp und können auch vererbt werden. Zwei beliebige Objekte können selbst eine Vererbungsbeziehung haben, und Arrays bilden da keine Ausnahme. Wir lassen also jeden Knoten eines Baums ein Array sein und behalten nur den Wert des Elements mit dem größten Index bei. Die Werte anderer Elemente werden durch prototypische Vererbung von Vorfahrenknoten geerbt. Auf diese Weise können wir vom Wurzelknoten zum Blattknoten auf den Pfad zugreifen, genau wie bei der Bedienung eines normalen Arrays. Hier ist eine einfache Implementierung:
Führen Sie
aus
<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>
Diese Verwendung gilt als relativ dunkle Magie und ist möglicherweise schwer zu verstehen, wenn Sie das Prinzip der prototypischen Vererbung nicht verstehen. Wenn es sich also nur um eine Implementierung einer Bibliothek handelt, kann es so geschrieben werden (ich habe es viele Male verwendet und es stellte sich heraus, dass es keine Gefahr gibt), aber wenn es direkt im Geschäftscode verwendet wird, kann es zu Beanstandungen kommen zu Tode. Obwohl diese Verwendung nicht gegen die Kernidee der JavaScript-Sprache verstößt.
Ein Merkmal dieser Verwendung besteht darin, dass der Wert des Vorgängerknotens automatisch mit allen untergeordneten Knoten synchronisiert wird, wenn er aktualisiert wird. Obwohl beim Zugriff auf die Prototypenkette auch ein Leistungsaufwand entsteht, ist dieser viel schneller, als den Baum selbst auf Codeebene zu durchlaufen. Wenn kein solcher Bedarf besteht und Sie nur eine einfache Zahl implementieren möchten, ist es natürlich besser, die traditionelle Methode zu verwenden. Schließlich ist dies zu sprachabhängig und es kann in Zukunft schwierig sein, auf andere Programmiersprachen zu migrieren.