调用嵌套Node节点的addChild方法报TypeError的问题如何解决
问题原因
- 你调用
addChild的对象graph.root.children[0]是普通JS对象,不是Node类的实例,自然没有类方法,具体导致该问题的两个核心原因:Node类的createNode方法中,给children数组push的是{name: childName, children: []}普通对象,不是Node实例Graph构造函数里,你把传入的Node实例做了解构,重新赋值给root的是个普通对象,直接把初始化的Node实例覆盖了
- 你没有在
Node类定义addChild方法,当前只有Graph类实现了addChild,就算是Node实例也调不到该方法
修复方案
- 给
Node类补充addChild方法,用于给当前节点添加子节点 - 修改
Node类的子节点生成逻辑,生成子节点时创建Node实例再存入children - 修改
Graph构造函数,直接保留传入的Node实例,不要转成普通对象 - 可选择将
Node的初始化逻辑合并到构造函数,简化调用逻辑
修复后完整代码:
class Node { name = ''; children = []; // 构造函数直接支持初始化名称和子节点名称 constructor(name = '', childNames = []) { this.name = name; childNames.forEach(childName => { // 子节点也生成Node实例,保留类方法 this.children.push(new Node(childName)) }) } // 给Node类新增addChild方法 addChild(node) { this.children.push(node); } } class Graph { root = null; constructor(node) { // 直接保留Node实例,不转成普通对象 this.root = node; } addChild(node) { console.log("Graph", JSON.stringify(node)); this.root.children.push(node); } } // 初始化逻辑 const rootNode = new Node('A', ['B', 'C', 'D']); const graph = new Graph(rootNode); const eNode = new Node('E', []); const fNode = new Node('F', []); // 现在可以正常调用addChild方法 graph.root.children[0].addChild(eNode); // 测试输出可看到B节点下已经添加了E子节点 console.log(graph.root.children[0]);
内容的提问来源于stack exchange,提问作者tlockhart
相关产品推荐
相关产品推荐

