在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;
}