2017-11-22 17 views
0

のために働いていない、私は、次の読み取り:{Symbol.toStringTag}は開始基準点に対するエラーオブジェクト

カスタマイズES6•よく知られているシンボルを介し

http://2ality.com/2015/09/well-known-symbols-es6.html

•.. 。そして&上述の例/コードセクションに基づく:デフォルトのtoStringタグ○

http://2ality.com/2015/09/well-known-symbols-es6.html#default-tostring-tags

...私は1つのまたは両方の以下のアプローチは、それが例えば「console.log(returnVal)」で使われているとき、私は「エラーオブジェクト」の動作を無効にできるようになることを期待する:

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)ステートメントはエラースタックトレース全体を返します(これは私が避けようとしているものです)。私は成功したカスタムオブジェクトの振る舞いを「設定する」ことを指摘したいと思い

だから私は一般的なアプローチは、「働く」を知って、私はちょうどそれがに関して動作するように見えることはできません組み込みのErrorオブジェクトに渡します。

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に近づく。)

任意のアイデア?

答えて

0

あなたはいくつかの主なことを誤解しています。

私は1つのまたは次の両方のアプローチが、それは、例えば、「はconsole.log(returnVal)」で使われているとき、私は「エラーオブジェクト」の動作を無効にできるようになることを期待する:

console.logオブジェクトをどのように表示するかの公式な仕様はありません。私の知る限り、現在の実装ではtoStringを使用していません。ノードは具体的にはオブジェクトに.inspect関数を持たせてレンダリングする値を返すことができますが、それはそれです。

第2に、あなたは何を誤解しているように見えますかtoStringTagです。 toStringTagは、具体的にはタグ文字列の値です。それはあなたの関数が何もしていない理由である関数ではありません。 A toStringTag使用方法は次のようになります

var obj = {}; 
obj.toString(); // [object Object] 
obj[Symbol.toStringTag] = "MyCustomThing"; 
obj.toString(); // [object MyCustomThing] 

それだけです。これは、のデフォルトのの実装で使用される単純な文字列値で、.toString()のオブジェクトです。

解決策はSymbol.toPrimitiveを上書きするか、.toStringよりも簡単にオーバーライドする可能性があります。この場合は、まったく同じ動作になります。その後、あなたのオブジェクトをログに記録するときに、ちょうどあなたがAnswerToLifeAndUniverseAndEverythingのように文字列に変換してください。

class CoolError extends Error { 
    constructor (args) { 
    super(args); 
    } 
    toString() { 
    return "*************" + this.name + " : " + this.message; 
    } 
} 
var returnVal = new CoolError("errMsg"); 

console.log("" + returnVal) 
// *************Error : errMsg 
関連する問題