1. 获取节点的构造函数: console.log(Object.getPrototypeOf(node).constructor.toString()); 内容为: function TreeNode(val, left, right) { this.val = (val===undefined ? 0 : val); this.left = (left===undefined ? null : left) this.right = (right===undefined ? null : right) } > 和你复现的写法完全一致。 2. 获取上述构造函数的原型对象: console.log(Object.getPrototypeOf(node).constructor).prototype 从这里得知该原型为: { [Symbol(nodejs.util.inspect.custom)]: [Function (anonymous)] } > 上面只有一个方法`Symbol(nodejs.util.inspect.custom)`。 3. 打印上面的方法: console.log( Object.getPrototypeOf(node).constructor .prototype[Symbol.for('nodejs.util.inspect.custom')].toString() ) 得到该方法的源代码: function (depth, opts) { return serializer.serializeTree(this); } `serializer` 不在全局环境,应该在模块或者定义`TreeNode`的封闭作用域(闭包)中,无法检测其函数源代码,不过从这个名字来看,是一个序列化函数。 根据掘金文章[util inspect node](https://link.segmentfault.com/?enc=%2B6aO7QpZdzFqSfP945ujVw%3D%3D.yAuzI2P7Q6JUEsVo9aIkL0UB2JYaUoHMEUcw7cKKE1dI%2FYeAGJqEP6xyrquX1Q8S): > `util.inspect`是Node.js中的一个模块,它提供了将任何JavaScript对象转换为字符串的功能。它通常用于调试和日志记录。 > > 当您在Node.js中使用`util.inspect`函数时,它会返回一个表示传递对象的字符串。您可以通过传递不同的选项来自定义字符串的格式。例如,您可以指定缩进、深度、颜色等选项。 4. 从上述描述看,这个函数的作用是在打印的时候把对象序列化为指定的字符串。 5. 如果要验证上述猜想,可以: const key = Symbol.for("nodejs.util.inspect.custom"); class SubTreeNode extends TreeNode{ [key](){ return "Exactly!" } } console.log(new SubTreeNode(8)); // Exactly! 不过浏览器开发者工具的`console.log`与 Node JS 环境下的行为并不一致,浏览器开发者工具中打印的时候,并不会将对象序列化为字符串,所以在浏览器中较难模拟这样的行为(可以通过`toString`方法自定义序列化方案,但只在拼接字符串的时候有效)。 至于将树展开成为数组的具体方案,应该是做了一个广度优先遍历。