2017-02-28 10 views
0

問題は、NodeJSモジュールからエクスポートされたクラスの静的メソッドから他の静的メソッドを参照する方法ですか?ここにセットアップがあります。私は以下のモジュールがあります。 ノードJSモジュールからエクスポートされたクラスの静的メソッドの参照

var Parent = class { 
    static smethod1() { 
     return this.smethod2(); 
    } 

    static smethod2() { 
     return "Testing tube"; 
    } 
} 

module.exports = { 
    Parent:Parent 
} 

test1.js

は、その後、私は持っている test2.js requireそのSこのモジュール

var mod = require('./test1'); 
var Parent = mod.Parent; 

module.exports = { 
    sm1: Parent.smethod1, 
    sm2: Parent.smethod2 
} 

最後に、私はrun.js

var test2 = require('./test2'); 

console.log(test2.sm1()); 

当然で実行されているコードを持って、私は"Testing tube"ラインが印刷されて見たいと思う。私はもちろん、エラー

 return this.smethod2(); 
        ^

TypeError: this.smethod2 is not a function 

を取得しています、そこthisはモジュールを指しNodeJS上のペテンだが、それは代わりに、関数に参照すべきではありませんか?現在の設定でsmethod1から静的メソッドsmethod2を参照する方法はありますか?そうでない場合は、どのような回避策がありますか?

+0

あなたはこの答えの表情を持つことができます。http://stackoverflow.com/a/28979516/1681972 – Ravi

+0

あなただけの静的メソッドを持つクラスを持っている場合、これはあなただけの関数をエクスポートする必要がありサインです直接とdクラスをelete、FYI。 – loganfsmyth

+0

@loganfsmythこれはもちろん簡単です。 – EvgeniySharapov

答えて

2

キーワードthisは、JavaScriptで奇妙なものであり、ほとんどのクラスベースの言語のようにインスタンスを常に参照するとは限りません。あなたがtest2.sm1()を呼び出すときにあなたのケースでは、thisは、オブジェクトがsmethod2機能を持っていないことを

{ 
    sm1: Parent.smethod1, 
    sm2: Parent.smethod2 
} 

あるtest2オブジェクトに設定されています。

thisは、具体的には、 '.':->test2<-.sm1()の前にある関数を使用して、JavaScriptで関数を呼び出す方法に基づいて設定されます。

いくつかの回避策があります。まず、Parentクラスを定義した後、あなたは、クラスにその関数のthisをバインドすることができます:

var Parent = class { 
    static smethod1() { 
     return this.smethod2(); 
    } 

    static smethod2() { 
     return "Testing tube"; 
    } 
} 

// bind `this` to `Parent` 
Parent.smethod1 = Parent.smethod1.bind(Parent); 

module.exports = { 
    Parent:Parent 
} 

代わりに、あなただけの1つの呼び出しのために手動でthisを設定callapplyへの引数としてParentを渡すことができます。

var Parent = require('./test1'); 
var test2 = require('./test2'); 

// call `test2.sm1` with a context of `Parent`  
console.log(test2.sm1().call(Parent)); 
+0

MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/staticの例を見てください。 – EvgeniySharapov

+0

@EvgeniySharapov興味深いことに、JavaScriptで意味をなさないと思います'this'で他の静的メソッドを呼び出します。私は私の答えを変えました。 – jct

+0

'bind'を使っているようです。 'test2.js'の' module.exports = {sm1:Parent.smethod1.bind(親)、sm2:Parent.smethod2.bind(親)} ' です。 – EvgeniySharapov

関連する問題