Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript {Symbol.toStringTag}不适用于错误对象_Javascript_Ecmascript 6_Javascript Objects_Es6 Class - Fatal编程技术网

Javascript {Symbol.toStringTag}不适用于错误对象

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

作为起始参考点,我阅读了以下内容:

•通过众所周知的符号定制ES6

。。。根据上述示例/代码和本节:

○ 默认toString标记

。。。例如,在“
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