2016-06-30 21 views
0

Javascript(Node.js)で非常に単純なOOPを実行しようとしていますが、問題があります。私は検索を含むすべてを試しましたが、答えは見つかりませんでした。Javascriptオブジェクト関数がnullを返す

基本的に、私は、このファイルTest.jsを持っている:

class Test { 

constructor(){ 
    this.name = 'Hey'; 
    this.config = 'null!'; 
    console.log('this.config: ' + this.config); 
} 

config(msg){ 
    this.config = msg; 
    console.log('new this.config: ' + this.config); 
} 

} 

module.exports = Test; 

(私も:)

function Test() 
{ 
    this.name = 'Hey'; 
    this.config = 'null!'; 
    console.log('this.config: ' + this.config); 
} 

Test.config = function(msg) // and Test.prototype.config 
{ 
    this.config = msg; 
    console.log('new this.config: ' + this.config); 
} 

module.exports = Test; 

をこのを試してみましたが、私は、この他のファイルapp.jsを持っている:

var TestModule = require('./Test.js'); 
var Test = new TestModule(); 
var test = Test.config('hi'); 

その他の方法:試しました:

var TestModule = require('./Test.js'); 
var Test = new TestModule().config('hi'); 

また動作しませんでした。

私は同じ事柄でconfig関数を実行しようとすると、オブジェクトがnullになってしまうのですが、何が起こったのか誰にも分かりますか?多分私は本当に明白な何かを見逃しているかもしれない

+3

'config()'関数には 'return'文がありません。 – Pointy

+3

'class'表記を使用していない場合は、必ず' Test.prototype.config'にしてください。 – Pointy

+0

[未定義オブジェクトのプロパティを検出する]の可能な複製(https://stackoverflow.com/questions/27509/detecting-an -undefined-object-property) –

答えて

0

あなた最初のスニペットが

class Test { 

    constructor() { 
     this.name = 'Hey'; 
     this.config = 'null!'; 
     console.log('this.config: ' + this.config); 
    } 

    config(msg) { 
     this.config = msg; 
     console.log('new this.config: ' + this.config); 
    } 

    } 

    module.exports = Test; 

config正しいのは、インスタンスメソッドではないクラスメソッドまたは静的メソッドです。

テストインスタンスでconfig()に電話する必要があります。今

var Test = require('./Test.js'); 
var testObj = new Test(); 

testObjのようなインスタンスであり、あなたは、このオブジェクトにconfig()メソッドを呼び出すことができます。

test.config('Hi'); 

それは/印刷するメッセージをログに記録ができますが、その方法から何かを返されていないので、それは任意のものが、undefinedを返しませんでしょう。

これが問題を説明してくれることを願っています。

+0

ああ、そうだ。ですから、 'new Test()でそれを行うことができます。config( 'hi') 'もし私がconfig関数で実際に"コンストラクタ "を使用したのなら、それは正しいでしょうか? –

+0

あなたは正しいですが、何も返さないため、これを変数に代入することはできません。 –

+0

ありがとう! :-) –

0

var Testに関数の値がreturnになるように割り当てています。 configとして

var test = Test.config('hi!'); 

が、これはヌルであることtestになり、何も返しません。

configメソッドを返すか(これは"method chaining" design patternの形式になります)、単にconfig呼び出しの結果を変数に代入しないでください。

たとえば、あなたは、単にこれを行うことができます:

var test = new TestModule(); 
test.config('hi!'); 
// the 'test' variable still contains a reference to your test module 
関連する問題