JavaScript でカスタムエラーを作成するにはどうすればいいですか? 質問する

JavaScript でカスタムエラーを作成するにはどうすればいいですか? 質問する

何らかの理由で、次のスニペットではコンストラクター委任が機能しないようです。

function NotImplementedError() { 
  Error.apply(this, arguments); 
}
NotImplementedError.prototype = new Error();

var nie = new NotImplementedError("some message");
console.log("The message is: '"+nie.message+"'")

これを実行すると が返されますThe message is: ''。理由や、新しいサブクラスを作成するためのより良い方法があるかどうかについて何かアイデアはありますか?ネイティブコンストラクターへの の実行に、私が知らないError問題があるのでしょうか?applyError

ベストアンサー1

コードを更新してプロトタイプを Error.prototype と instanceof に割り当てると、アサートが機能します。

function NotImplementedError(message = "") {
    this.name = "NotImplementedError";
    this.message = message;
}
NotImplementedError.prototype = Error.prototype;

ただし、独自のオブジェクトをスローして、名前プロパティをチェックするだけです。

throw {name : "NotImplementedError", message : "too lazy to implement"}; 

コメントに基づいて編集する

コメントを見て、なぜ私がプロトタイプを に割り当てるのか思い出そうとしたのか思い出そうとしたError.prototypeが、new Error()ニコラス・ザカスが記事、私はjsFiddle以下のコードを使用します:

function NotImplementedError(message = "") {
  this.name = "NotImplementedError";
  this.message = message;
}
NotImplementedError.prototype = Error.prototype;

function NotImplementedError2(message = "") {
  this.message = message;
}
NotImplementedError2.prototype = new Error();

try {
  var e = new NotImplementedError("NotImplementedError message");
  throw e;
} catch (ex1) {
  console.log(ex1.stack);
  console.log("ex1 instanceof NotImplementedError = " + (ex1 instanceof NotImplementedError));
  console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
  console.log("ex1.name = " + ex1.name);
  console.log("ex1.message = " + ex1.message);
}

try {
  var e = new NotImplementedError2("NotImplementedError2 message");
  throw e;
} catch (ex1) {
  console.log(ex1.stack);
  console.log("ex1 instanceof NotImplementedError2 = " + (ex1 instanceof NotImplementedError2));
  console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
  console.log("ex1.name = " + ex1.name);
  console.log("ex1.message = " + ex1.message);
}

コンソール出力は次のようになりました。

undefined
ex1 instanceof NotImplementedError = true
ex1 instanceof Error = true
ex1.name = NotImplementedError
ex1.message = NotImplementedError message
Error
    at window.onload (http://fiddle.jshell.net/MwMEJ/show/:29:34)
ex1 instanceof NotImplementedError2 = true
ex1 instanceof Error = true
ex1.name = Error
ex1.message = NotImplementedError2 message

これにより、私が遭遇した「問題」は、エラーのスタック プロパティが、new Error()発生した行番号ではなく、作成された行番号であったことが確認されました。ただし、これは、Error オブジェクトに影響を与える行throw eの副作用があるよりも良いかもしれません。NotImplementedError.prototype.name = "NotImplementedError"

また、 のNotImplementedError2場合、 を明示的に設定しないと.name、「エラー」と等しくなります。ただし、コメントで述べたように、そのバージョンではプロトタイプが に設定されるためnew Error()、 を設定しNotImplementedError2.prototype.name = "NotImplementedError2"て OK にすることができます。

おすすめ記事