Javascript {Symbol.toStringTag}不适用于错误对象
作为起始参考点,我阅读了以下内容: •通过众所周知的符号定制ES6 • 。。。根据上述示例/代码和本节: ○ 默认toString标记 ○ 。。。例如,在“Javascript {Symbol.toStringTag}不适用于错误对象,javascript,ecmascript-6,javascript-objects,es6-class,Javascript,Ecmascript 6,Javascript Objects,Es6 Class,作为起始参考点,我阅读了以下内容: •通过众所周知的符号定制ES6 • 。。。根据上述示例/代码和本节: ○ 默认toString标记 ○ 。。。例如,在“console.log(returnVal)”中使用“Error对象”时,我希望以下一种或两种方法都允许我重写它的行为: console.log("Approach #1"); class CoolError extends Error { constructor (args) { super(args); } [Sym
console.log(returnVal)
”中使用“Error对象”时,我希望以下一种或两种方法都允许我重写它的行为:
console.log("Approach #1");
class CoolError extends Error {
constructor (args) {
super(args);
}
[Symbol.toPrimitive] (hint) {
return "*************" + this.name + " : " + this.message;
// note: I shouldn't need this, however, it doesn't work either...
}
[Symbol.toStringTag] (hint) {
return ">>>>>>>>>>>>>" + this.name + " : " + this.message;
}
}
returnVal = new CoolError("errMsg");
console.log("returnVal[Symbol.toPrimitive] === " + returnVal[Symbol.toPrimitive]);
console.log(" ");
console.log(returnVal);
console.log(">");
console.log(" >");
console.log(" >");
console.log(" >");
console.log("Approach #2");
returnVal = new Error("errMsg");
console.log("returnVal[Symbol.toStringTag] === " + returnVal[Symbol.toStringTag]);
returnVal[Symbol.toStringTag] = function (hint) {return "*************" + this.name + " : " + this.message};
console.log("returnVal[Symbol.toStringTag] === " + returnVal[Symbol.toStringTag]);
console.log(" ");
console.log(returnVal);
。。。然而,没有这样的运气。。。在这两种情况下,console.log(returnVal)语句都返回整个错误堆栈跟踪(这正是我试图阻止的)
我想指出,我可以成功地“设置”自定义对象的行为:
所以我知道一般的方法“有效”,我只是不能让它对内置的错误对象有效
class AnswerToLifeAndUniverseAndEverything {
[Symbol.toPrimitive] (hint) {
console.log(typeof hint);
console.log(hint);
if (hint === 'string') {
console.log('string');
return 'Like, 42, man';
} else if (hint === 'number') {
console.log('number');
return 42;
} else {
console.log('default');
// when pushed, most classes (except Date) default to returning a number primitive
return 42;
}
}
}
var answer = new AnswerToLifeAndUniverseAndEverything();
console.log( Number(answer) + " === 42");
console.log( String(answer) + " === 'Like, 42, man'");
(另外,如果可能的话,我希望它能够使用上述两种尝试方法(1和2)工作。)
有什么想法吗?你误解了几个主要问题 例如,当在“console.log(returnVal)”中使用“Error对象”时,我希望以下一种或两种方法都允许我重写它的行为:
console.log("Approach #1");
class CoolError extends Error {
constructor (args) {
super(args);
}
[Symbol.toPrimitive] (hint) {
return "*************" + this.name + " : " + this.message;
// note: I shouldn't need this, however, it doesn't work either...
}
[Symbol.toStringTag] (hint) {
return ">>>>>>>>>>>>>" + this.name + " : " + this.message;
}
}
returnVal = new CoolError("errMsg");
console.log("returnVal[Symbol.toPrimitive] === " + returnVal[Symbol.toPrimitive]);
console.log(" ");
console.log(returnVal);
console.log(">");
console.log(" >");
console.log(" >");
console.log(" >");
console.log("Approach #2");
returnVal = new Error("errMsg");
console.log("returnVal[Symbol.toStringTag] === " + returnVal[Symbol.toStringTag]);
returnVal[Symbol.toStringTag] = function (hint) {return "*************" + this.name + " : " + this.message};
console.log("returnVal[Symbol.toStringTag] === " + returnVal[Symbol.toStringTag]);
console.log(" ");
console.log(returnVal);
console.log
没有关于如何显示对象的正式规范。据我所知,当前的实现都没有使用toString
。节点特别允许对象使用.inspect
函数返回要渲染的值,但仅此而已
其次,您似乎误解了toStringTag
的用途toStringTag
是一个标记字符串值。它不是一个函数,这就是为什么你的函数没有做任何事情。toStringTag
用法可能如下
var obj = {};
obj.toString(); // [object Object]
obj[Symbol.toStringTag] = "MyCustomThing";
obj.toString(); // [object MyCustomThing]
就这样。它是一个简单的字符串值,用于对象上的.toString()
的默认实现
考虑到您正在寻找的内容,您的解决方案将覆盖Symbol.toPrimitive
,或者更容易地覆盖.toString
,因为在这种情况下,这将具有完全相同的行为。然后,当您记录对象时,只需首先将其转换为字符串,就像您在回答ifeanduniverseand和所有内容中所做的那样
class CoolError extends Error {
constructor (args) {
super(args);
}
toString() {
return "*************" + this.name + " : " + this.message;
}
}
var returnVal = new CoolError("errMsg");
console.log("" + returnVal)
// *************Error : errMsg