2016-06-19 11 views
0
var Controller = function() { 

try { 
    throw new this.userException('test', 'test'); 
    } catch (error) { 
    if (error instanceof this.userException) { 
     console.error(error.stack); 
    } 
    } 
} 


Controller.prototype.userException = function (name, message, htmlMessage) { 
    this.name = name; 
    this.message = message; 
    this.htmlMessage = htmlMessage; 
    Error.captureStackTrace(this, this.userException); 
    this.toString = function() { 
    return name + ' : ' + message; 
    } 
}; 

カスタム例外を作成しようとしていたときに、このError.captureStackTraceがノードJSドキュメントに見つかりました。まず、私は以下のように使いました。 console.error(error)オブジェクトのプロトタイプ関数の 'this'キーワードを理解しています

Error.captureStackTrace(this, userException); 

userExceptionメソッドのプロパティを含むオブジェクトを返す

Error.captureStackTrace(this, this.userException); 

に私はラインを変更なしoutput.Byミスを与えませんでした。またconsole.error(error.stack);stack traceを印刷します。私はとても混乱していますthisキーワードはこのステートメントでどのように動作しますError.captureStackTrace(this, this.userException);。第一引数と第二引数のキーワードは何ですか?this?それは同じControllerオブジェクトですか?しかし、もう一度、なぜ私はthisを第一引数と第二引数として提供しなければならなかったのですか?

+0

プロトタイプオブジェクトにコンストラクタ関数を配置しないでください。彼らは方法ではありません。 – Bergi

答えて

0

あなたはnew経由userExceptionを呼んでいるので、その中のthisnewオペレータによって作成された新しいオブジェクトです。これは現在、通常はプロトタイプ関数を呼び出すのと異なり、がおそらくController.prototypeにあるべきではないことを示唆しています。

あなたのコードは(それはコントローラのプロトタイプではなく、自立した識別子のプロパティです)、それはスコープ内userException識別子が存在することになることを期待していたので、あなたがthis.userExceptionを持っていなかったときに失敗しますが、ありませんでした。

this.を追加すると、フリースタンディング識別子が検索されなくなるため、その名前のthisというプロパティが検索されるため、これが動作を開始しました。何もありませんが、それはいいです、それはちょうどundefinedcaptureStackTraceに渡し終わります。私はcaptureStackTraceを見つけることができるかを見てみると

、与えられた場合は、2番目の引数はオプションで、機能として期待されているので、おそらくそれだけでundefinedあなたがそれを与え、あなたは/その代わりError.captureStackTrace(this);をやるべきことができを無視しています。

関連:Errorをサブクラス化することはES5およびそれ以前では非常に困難であること

注意。あなた自身のロールをしようとしないで、すでにあなたのために構築されたものを使用してください。 Babel(ES5 JavaScriptエンジンでES2015を使用するために使用できるJavaScriptトランスフェーラー)の背後にいる素敵な人たちがあなたのために働いてくれました。 ES2015のclass構文を使用してErrorを拡張し、Babelを使用してトランスペアレントにすることができます。しかし、それはあなたがしようとしていることのどれに過度のものかもしれません。

+0

サンプルはありますか?人々は単語の束をパースするのが好きではありません。 –

関連する問題