:Working fiddle
function ErrorChild(name, message) {
// Error.call(this); this is not needed
this.name = name;
this.message = message;
}
ErrorChild.prototype = Object.create(Error.prototype);
ErrorChild.prototype.constructor = ErrorChild;
var myerror = new ErrorChild("test", "Help!");
document.body.innerHTML += myerror.message;
上記期待される動作を中断されません。 throw myerror
の場合、正しいname
とmessage
が表示されます。
ECMA5言語仕様から問題
:
15.11.1関数として呼び出すエラーコンストラクタエラーを関数としてではなく、コンストラクタと呼ばれている
は新しいErrorオブジェクトを作成して初期化します。したがって、関数呼び出し エラー(...)は、オブジェクト作成式new と同じ引数を持つエラー(...)と同等です。
問題:Error.call(this)
は、new Error
に相当します。しかし、new Error
インスタンス化ではname
またはmessage
は設定されません。 new Error
は、デフォルトでmessage
を""
に初期化します。
15.11.4.3 Error.prototype.message#ⓉоError.prototype.messageの初期値は、空のStringです。
テスト(proof)
内側であれば、あなたのErrorChild
追加しました:
var test = Error.call(this, message);
console.dir(test);
console.log(test instanceof Error); // true;
console.log(test.message); // "Help!";
test
がECMA5仕様を反映しています。適切なmessage
が設定されたError
インスタンス。
結論:
Error.call(arguments);
自動的new Error(arguments);
範囲に翻訳さなのでが失われ、その性質はthis
オブジェクトに初期化されることはありません。
Object.create(Error.prototype)
を使用すると、message
プロパティはデフォルト値の空のStringをとります。
問題は、(HTTP [ '関数としてERROR'を呼び出す]ということです - あなたは
throw
周りlog
とcatch
でき.io /#x15.11.1)はコンストラクタを呼び出すように振る舞います( 'new Error')。 – C5H8NNaO4
あなたは答えを更新して問題を説明するのを待っていました。 D – C5H8NNaO4
ええ、あなたの編集が10秒後に私の回答に気付いた^^(これは+1)、確かに面白い質問*(すでに何度か尋ねられましたが)* コミュニティーウィキwoldこのような質問(これをcwとして欺くのはなぜですか?) ええ、しかし、私は彼らがかなり良い問題をカバーすると思います。 =) – C5H8NNaO4