Data berstruktur pokok sering digunakan semasa menulis beberapa pustaka dan sesetengah data berstruktur pokok mempunyai keperluan yang sangat tinggi untuk mendapatkan laluan dari akar ke daun. Sebagai contoh, keseluruhan jadual penghalaan tapak ialah pokok sedemikian, dan "laluan"nya sebenarnya ialah bahagian laluan URL. Jadi saya telah menggunakan warisan tatasusunan gila beberapa kali untuk melaksanakannya, dan saya akan berkongsi dengan anda di bawah.
Dalam JavaScript, tatasusunan juga merupakan jenis Objek dan juga boleh diwarisi. Mana-mana dua objek sendiri boleh mempunyai hubungan warisan, dan tatasusunan tidak terkecuali. Jadi kita biarkan mana-mana nod pokok menjadi tatasusunan, dan ia hanya mengekalkan nilai elemen dengan subskrip terbesar. Nilai elemen lain diwarisi daripada nod nenek moyang melalui pewarisan prototaip. Dengan cara ini, kita boleh mengakses laluan dari nod akar pada nod daun sama seperti mengendalikan tatasusunan biasa. Berikut ialah pelaksanaan mudah:
Lari
<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>
Penggunaan ini dianggap sebagai sihir yang agak gelap, dan mungkin sukar untuk difahami jika anda tidak memahami prinsip pewarisan prototaip. Jadi jika ia hanya pelaksanaan perpustakaan, ia mungkin ditulis seperti ini (saya telah menggunakannya berkali-kali, dan ternyata tidak ada perangkap), tetapi jika ia digunakan secara langsung dalam kod perniagaan, ia mungkin dikeluhkan sampai mati. Walaupun penggunaan ini tidak melanggar idea teras bahasa JavaScript.
Satu ciri penggunaan ini ialah apabila nilai nod nenek moyang dikemas kini, ia akan disegerakkan secara automatik kepada semua nod anak. Walaupun terdapat juga overhed prestasi apabila mengakses rantaian prototaip, ia jauh lebih pantas daripada melintasi pokok itu sendiri pada tahap kod. Sudah tentu, jika tidak ada permintaan sedemikian dan anda hanya mahu melaksanakan nombor mudah, lebih baik menggunakan kaedah tradisional. Lagipun, ini terlalu bergantung kepada bahasa, dan mungkin sukar untuk berhijrah ke bahasa pengaturcaraan lain pada masa hadapan.