在写一些库时经常会用到树结构的数据,而且一些树形结构的数据对从根到叶的路径获取需求非常高。比如一个站点的整个路由表就是一棵这样的树,它的「路径」实际上就是 URL 中的 path 部分。所以我好几次都用了丧心病狂的数组继承去实现,下面给大家分享下。
在 JavaScript 中,数组也属于 Object 的一种,它也可以继承。任何两个对象本身就可以有继承关系,数组也不例外。于是我们让一个树的任何一个节点都是数组,它只维护自己下标最大的那个元素的值。其它元素的值通过原型继承从祖先节点继承而来。这样我们就可以像操作一般数组一样在叶节点上访问从根节点过来的路径了。下面是一个简易实现:
运行
<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 这种语言的核心思想。
这个用法的一个特点就是祖先节点的值更新时会自动同步到所有子节点上。虽然原型链访问也存在性能开销,但比起在代码层自己去遍历树已经是快得不能再多了。当然如果没有这样的需求,只是想实现一棵简简单单的数还是使用传统方式比较好。毕竟这太依赖语言了,以后如果要迁移到别的编程语言可能会比较困难。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年10月09日
2024年10月09日
- 【原神】V5.0攻略 | 纳塔入门手册·燃素定量篇
- 战略游戏《盟军敢死队:起源》已于Steam上线试玩版
- 这几天,有多少玩家被魔性的“沙威玛”洗脑了?
- 英国9月游戏销量排行榜:《EA Sports FC 25》领跑
- 大侠立志传囚龙之地任务怎么做 任务图文攻略
- 新月同行碎银子技能介绍 六星绑定者碎银子
- 炉石传说T0天梯卡组推荐 2024最强卡组一览
- 英雄联盟世界赛2024门票多少钱 S14世界赛2024门票价格介绍
- lols14全球总决赛门票去哪买 s14世界赛2024门票购买方法
- dnf手游决斗场商店买什么好 决斗场商店高性价比物品购买推荐
- IGN评价《寂静岭2RE》:最痛苦却最成功的恐怖体验
- 西班牙全跨性别足球队首次亮相 将正式踢比赛
- 《怪猎荒野》新接待员超受欢迎 玩家:新老婆来了!
- 王钰《尘雾涅槃——王钰古筝独奏专辑》[320K/MP3][148.89MB]
- 王钰《尘雾涅槃——王钰古筝独奏专辑》[FLAC/分轨][298.09MB]