そのページの説明を理解するのは確かに少し難しいです、これがどのように行われるかです:
Error.prepareStackTrace = function(error, stack) {
return stack;
};
var someObj = {
someMethod : function () {
crash();
}
}
function bar(barArg) { someObj.someMethod(); };
function foo(fooArg) { bar("barArgString"); };
function getTrace(e) {
var stack = e.stack;
var trace = "";
for (var i = 0; i < stack.length; i++) {
var frame = stack[i],
func = frame.getFunction();
trace += "\r" + frame.getThis() + "." + frame.getFunctionName();
}
return trace;
}
try {
foo("fooArgString");
} catch (e) {
alert("trace from catch(): " + getTrace(e));
}
これは次のように表示されます。
trace from catch():
[object Object].someObj.someMethod
[object Window].bar
[object Window].foo
[object Window].
最後のフレームはグローバルスコープです(関数名なし)。
基本的に、prepareStackTrace()をオーバーライドすると、error.stackがprepareStackTrace()から返されるものになります。秘訣は、prepareStackTrace()の2番目の引数がCallSiteオブジェクトの配列(getThis()、getFunctionName()などをサポートするオブジェクト)であるということです。
上記のコードはprepareStackTrace()をオーバーライドして、CallSiteオブジェクトの配列(上記の「stack」パラメーター)を返すようにします。つまり、エラーをキャッチしようとすると、Error.stackにはCallSiteオブジェクトの配列が含まれます。文字列形式の通常のスタックトレース。別のアプローチは、置換のprepareStackTrace()関数内でCallSiteオブジェクトを処理し、代替のスタックトレースを文字列として返すことです。
CallSiteオブジェクトは本当に気難しいことに注意してください。frame.toString()を実行するか、alert(frame)を実行してみてください(暗黙的にこれにはtoString()が含まれます)。クラッシュし、Chromeの開発ツールはエラーを表示しません。