在JavaScript中,重写console.dir(myObj)的根文本

在JavaScript中,重写console.dir(myObj)的根文本,javascript,Javascript,我正在尝试创建一个类,FriendlyStack,用于调试具有消息和堆栈跟踪的类。我主要用它来检测比赛情况。在类的实例上调用console.dir时,我希望根节点的文本显示消息 我的函数名是gotHere(),它在FriendlyStack的实例上调用console.dir // debugging helper function function gotHere(msg) { console.dir(new FriendlyStack(msg)); } class FriendlyS

我正在尝试创建一个类,
FriendlyStack
,用于调试具有消息和堆栈跟踪的类。我主要用它来检测比赛情况。在类的实例上调用
console.dir
时,我希望根节点的文本显示消息

我的函数名是
gotHere()
,它在
FriendlyStack
的实例上调用
console.dir

// debugging helper function
function gotHere(msg) {
    console.dir(new FriendlyStack(msg));
}

class FriendlyStack {
    constructor(msg) {
        this.msg = msg;

        // new Error().stack gets the string of the stack trace
        // .split('\n') creates an array of each line of the stack trace
        // .slice(3) removes the first three lines, which are:
        //    Error
        //       at new FriendlyStack (...)
        //       at gotHere (...)
        this.stack = new Error().stack.split('\n').slice(3);
    }

    // some override to make console.dir display this.msg as the root node
    // instead of FriendlyStack
}
对于大多数类/对象,当您调用
console.dir
时,显示的树的根是对象原型的名称

console.dir({foo: 'bar'})
v Object
    foo: "bar"
  > __proto__: Object

console.dir([1, 2, 3])
v Array[3]
   0: 1
   1: 2
   2: 3
   length: 3
 > __proto__: Array[0]
但是,当您在字符串或数字上调用它时,显示的根就是值

console.dir(1)
> 1

console.dir('foobar')
> foobar
考虑到调用
console.dir(someObject)
的行为,
console.dir(1)
将显示
Number
作为根节点。这种不同的行为表明,可能有一种方法可以更改作为根节点打印的内容,但也可能只是原语是特殊情况


有没有办法达到我想要的行为?我尝试过重载FriendlyStack.toString,但没有成功。

如果要记录字符串而不是对象,请使用返回字符串的函数(而不是创建实例):


将您想要的行为表述为“让console.dir()显示记录数据的原始数据类型”是否准确?问题是,
console.dir
特别关注具有更深层结构的Javascript对象。原语没有。特别是考虑到console.dir是一个非标准(甚至不是标准跟踪)的东西,随着时间的推移,维护它可能也很困难。其他一切都是一个对象<代码>[Object Object]只是一个相当无用的字符串转换。它看起来不会。您是否希望邮件也以交互方式更新?我想我真的很困惑动态更新堆栈跟踪的目的是什么,它基本上是关于过去的事实的转储(即不受未来更改的影响)。或者,为什么不在调用
console.dir
之前使用console.log发出消息呢?我不需要它来动态更新任何内容。调用
gotHere()
后,堆栈不会更改。但你说得很好。我应该先
console.log(msg)
,然后
console.dir(myStack)
。它避免了过度设计。这实际上是我最初的想法。不过,我不喜欢日志中的杂乱,因为字符串太长了。我希望每个项目有一行,可以展开以查看堆栈详细信息。不,您不能这样做,无法控制记录值的格式。您可以尝试类似于
console.log(msg,new Stack())
的方法
function gotHere(msg) {
    console.dir(friendlyStack(msg));
}

function friendlyStack(msg) {
    // new Error().stack gets the string of the stack trace
    // .split('\n') creates an array of each line of the stack trace
    // .slice(3) removes the first three lines, which are:
    //    Error
    //       at new FriendlyStack (...)
    //       at gotHere (...)
    const stack = new Error().stack.split('\n').slice(3);

    return msg + "\n" + stack;
}