6

ネイティブ オブジェクトを使用した Javascript のコンストラクタ チェーンの継承について、何かが欠けているようです。例えば ​​:

function ErrorChild(message) { Error.call(this, message); }
ErrorChild.prototype = Object.create(Error.prototype);
var myerror = new ErrorChild("Help!");

これらのステートメントの後にmyerror.message定義されるのはなぜですか? ""エラーコンストラクターがそれを「ヘルプ!」と定義することを期待します。(そしてのデフォルト値をオーバーライドしますError.prototype.message)、私がやっていたかのように:

var myerror = new Error("Help!")

どうもありがとう !

4

2 に答える 2

1

問題は継承チェーンではなく、関数としての呼び出しがコンストラクターの呼び出しとして動作し、オブジェクトをインスタンス化するというErrornew Error事実です。

したがって、実行されたコードを呼び出すと、new ErrorChild実際には次のようになります

function ErrorChild(message) {
 new Error (message) 
}

待って。しかし、これはどこにも使用されていない(また、コンストラクターによっても返されない)新しいエラー オブジェクトを作成するだけです。そして、単に忘れられます。

したがって、これは実際には実際のインスタンスを変更しません。ErrorChild

したがって、messageアクセスしているプロパティは、ErrorChild.prototypeから継承されたものでError.protyotypeあり、したがってmessageデフォルト値である空の文字列が含まれています。""

しかし、単純にエラー オブジェクトを「模倣」することはできます。

toStringメソッドの定義された動作と 2 つのプロパティのみが必要なため

  • name
  • message

エラーの標準プロパティをカバーします。

コンストラクターのプロトタイプを設定して手動でError.prototype 割り当てるだけです。namemessage

function ErrorChild (name,message) {
  this.name = name;
  this.message = message;
}
ErrorChild.prototype = Error.prototype;

これで、インスタンスを簡単に作成できnew ErrorChild (...)ます。

あなたができることthrowlog- catch>

throw new ErrorChild("CustomError","Help") //Uncaught CustomError: Help

JSBinのデモはこちら

于 2013-05-13T09:28:08.000 に答える