2016-10-30 17 views
1

オブジェクト:NodeJSは、私はエラーオブジェクトを拡張してカスタムエラーオブジェクト持って継承

function GTError(reason, loglevel, meta) { 
    winston.log(loglevel, reason, meta); 
    GTError.super_.apply(this, arguments); 
} 

util.inherits(GTError, Error); 

私はこれが動作しないことを知っているし、そしてthis questionはそのための回避策があります。私の質問はそれを回避する方法ではない、私の質問はなぜは動作しません? GTError.super_.apply(this, arguments);GTError.super_Error)を呼び出すのはなぜですかのmessageプロパティを設定しないのですか?

enter image description here

あなたは、してください説明できますか? おかげ

+0

あなたはutil.inherits' 'のコードを表示する必要がありますか、それはライブラリからだ場合、どちらを伝える:以下は、クロムまたはFirefoxの最近のバージョンで動作します。 – JJJ

+0

@JJJ https://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor – robertklep

+0

「GTError.super_」とは何ですか? – Joseph

答えて

1

は、私の質問は、それを回避する方法はないはそれが動作しない理由は、私の質問はありますか?

Error関数は常にあなたがnewとそれを呼び出すことはありません場合でも、新しいインスタンスを返すので、それはオブジェクトを変更しませんthisはあなたがそれを呼び出すときを指します。 the ES5 specificationから:Errorを関数としてではなく、コンストラクタと呼ばれている

、それが作成され、新しいErrorオブジェクトを初期化します。したがって、関数呼び出しError(…)は、同じ引数を持つオブジェクト作成式new Error(…)と同等です。それが作成され、むしろErrorthisとして渡されたオブジェクトを移入することよりも、Errorオブジェクトを破棄しますので、だからあなたのコード内の

GTError.super_.apply(this, arguments);GTError.super_があるError)は、効果的に何もしません。実際、Errorが定義された方法のためにがnewによって作成されたオブジェクトをあなたのnew GTErrorという表現に入れるようにする方法はありません(ES5)。

TC-39委員会はES2015で修正しましたが、これは新しいクラスのものを使用している場合のみです(下位互換性を維持するため)。


は、私はあなたがちょうど理由を知りたいと思ったが、他人のために言った知っている:ES2015以降では、正しく新しいclassものを経由してErrorをサブクラス化することができます。この構文は、少なくともノードv4では厳密モードでサポートされ、汎用的にはノードv6でサポートされています。

let winston = { 
 
    log: function(...args) { 
 
    console.log("log", ...args); 
 
    } 
 
}; 
 
class GTError extends Error { 
 
    constructor(reason, loglevel, meta) { 
 
     winston.log(loglevel, reason, meta); 
 
     super(reason, loglevel, meta); 
 
    } 
 
} 
 
try { 
 
    throw new GTError("reason", 10, "meta"); 
 
} 
 
catch (e) { 
 
    console.log(e instanceof Error); 
 
    console.log(e instanceof GTError); 
 
    console.log(e.message); 
 
}

関連する問題