2013-07-08 9 views
6

私は小さなJSライブラリを開発していましたが、そこにカスタムエラー例外を使用しました。JavaScriptエラー/例外の拡張

var MyError = function(){ 
    Error.prototype.constructor.apply(this, arguments); 
}; 

// Inherit without instantiating Error 
var Surrogate = function(){}; 
Surrogate.prototype = Error.prototype; 
MyError.prototype = new Surrogate(); 

// Add some original methods 
MyError.prototype.uniqueMethod = function(){...} 

は通常の継承のように見える...しかし:(?ORLY)

だから、私はこの方法でネイティブのJavaScriptエラーオブジェクトからそれらを継承することにしました! 、エラーのコンストラクタでない場合 -

var MyError = function(msg){ 
    this.message = msg; 
}; 

しかし、私の質問は:

var err = new MyError("hello! this is text!"); 
console.log(err.message); // is giving me empty string! 

私はこのhere程度とMDN記事を読んだことがあるが、それらのすべては、私はこのようなものを使用することを言ってメッセージはどこで初期化されますか? 誰かがエラーネイティブコンストラクタの仕組みを知っているかもしれませんか?

ありがとうございます!

P.S.興味があれば - 私はEnum.jsライブラリを開発していました。

+1

'var obj = new Error(); Error.call(obj、 "Hello、world!"); ' これはうまくいきません。 「エラー」は奇妙です。 – Ryan

+1

@minitech:* "エラーは奇妙です。" * +1 –

答えて

5

あなたがしていることは問題ありません。それは問題ですErrorです。この行で

Error.prototype.constructor.apply(this, arguments); 

...あなたは通常の関数呼び出しとしてではなく、new式の一部として(間接的に)Errorを呼んでいる、とdefined behavior for Error when you call it as a non-constructor functionは新しい、空白を作成することです(thisを入力するのではなく)Errorを返します。

通常の場合、プロトタイプで行っていることは、コンストラクタ(if (this instanceof Error))として呼び出されたかどうかの標準チェックを行います。残念ながら、それはやっていないようで、どのように呼び出されたかを判断するためにどのようなチェックをしても、あなたがしようとしていることにすぐに順応できないようです。これは単なるテストであり、あなたが実際にやっていることではありません。

MyError.prototype = Error.prototype; // You wouldn't normally do this, it's just a test 

...それを解決しませんでした。可能な回避策に

This answer to another Stack Overflow questionポイント(基本的には、Errorは、オブジェクトを作成し、MyErrorからのことを返してみましょう):あなたは、むしろオブジェクトに直接拡張機能を置く必要があるだろうと

function MyError(message) { 
    var e = new Error(message); 
    // ...apply your enhancements to `e` 
    return e; 
} 

驚くほど満足しませんプロトタイプチェーンを使用するよりも、Errorがボールのプレイを拒否した場合は、オプションが少し制限されています。

+0

回答ありがとうございます。だから、私はsmthのようにする必要があるようです: 'MyError = function(msg){var err = new Error(); this.msg = msg; this.stack = err.stack; ...} – gobwas

+0

@gobwas:可能性のある回避策を使用して回答を更新しました。私はそれが好きではありませんが、あなたにはたくさんの選択肢があるとは思いません。 *編集*または、そう、あなたはそんなやり方でやり遂げることができます。 –

+1

ありがとう、はい、多くのchoises =)) – gobwas

関連する問題