2016-07-29 12 views
1

私はJavaからNodeJsに切り替えるので、いくつかのことはまだ私にはぼやけています。「this」を使用する必要がありますか? NodeJsの「オブジェクト」属性を処理するには?

私はJavaのクラスと同様にスクリプトで作業しようとしています。私は、コンソールログに162.*.*.* undefined undefined undefined ...を持っています

var sftpHandler = new SftpHandler(credentials.sftpHost, credentials.sftpUsername, credentials.sftpPassword); 
sftpHandler.downloadFile(credentials.sftpPathToImportFiles+configFile.importFileName, callback); 

:私はこのような別のスクリプトから呼び出すとき

var client = require('scp2'); 
var host, username, password; 

var SftpHandler = function (host, username, password) { 
    this.host = host; 
    this.username = username; 
    this.password = password; 
}; 



SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host,username,password,path); 
}; 

module.exports = SftpHandler; 

問題がある:私は、これはそれを行う方法で学びました。

私が言及しているオブジェクトの属性にはthis.が不足していることが分かりました。しかし、なぜthis.が必要ですか?それはそれを行う正しい方法ですか?

答えて

2

JavaとJavaScriptの間のコンセプトをマップするのは少し難解です。

短い答えは、JavaScriptでJavaのクラスインスタンスのようなものを作成しようとする場合、「this」を呼び出す必要があることです。

JSのthisは、実際には呼び出しスコープを参照する関数内の特殊なローカルスコープ変数です。実際のクラスインスタンスではないと信じているので、より完全にそれを読み上げる必要があります。

多くの人々は、Javaのイディオムに続くいくつかの場所が問題になるか、それ以外のものを維持するのが困難で複雑なものになってしまうため、試してみることをお勧めします。

しかし、いずれにしても、あなたのdownloadFile方法は、ネストされた機能を提供するために、必要に応じてthisは、変更することができる方法の一例として、例えば、あなたは匿名関数とコールバックを処理したい:

SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host); // this here refers to your object instance 
    fileManager.getFile(path, function(e, file){ 
     console.log(this.host); // 'this' here refers to the anonymous function, not your object 
    }) 
}; 

・ホープそれは助ける。

**コールバック内thisを取得する方法について編集**

参照を維持するカップルの方法があります。それはちょうどそのように、元thisに範囲内の別の変数を設定することは非常に一般的です:

SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host); // this here refers to your object instance 
    fileManager.getFile(path, function(e, file){ 
     console.log(this.host); // 'this' here refers to the your object thanks to bind() 
    }.bind(this)); 
}; 
+0

@Paulありがとうございます。あなたの例で書かれているように、ネストされた関数の 'this'はそれ自身のパラメータを参照します。だから、あなたは通常、その関数内からインスタンス/オブジェクト属性にどのようにアクセスしますか? +1 btw –

+2

@OndrejTokar - http:// stackoverflow。com/a/20279485/19068 – Quentin

+0

それは私のものです。しかし、私はそれが汚い解決だと思った。参考に感謝します。 –

1

は使用しないように:

SftpHandler.prototype.downloadFile = function (path, callback) { 
    console.log(this.host); // this here refers to your object instance 
    var self = this; 

    fileManager.getFile(path, function(e, file){ 
     console.log(this.host); // 'this' here refers to the anonymous function, not your object 
     console.log(self.host); // 'self' there refers to the enclosing method's 'this' 
    }) 
}; 

その他機能#バインドを使用すると、より明示的なことを好みますこのあなたのモジュールは、オブジェクトを返す関数とすることができる。

var client = require('scp2'); 

var SftpHandler = function (host, username, password) { 

    return { 
    downloadFile: downloadFile 
    }; 

    function downloadFile (path, callback) { 
    console.log(host, username, password,path); 
    } 
}; 

module.exports = SftpHandler; 

そしてあなたは、この関数を呼び出すのwi第新規

var sftpHandler = SftpHandler(credentials.sftpHost, credentials.sftpUsername, credentials.sftpPassword); 
sftpHandler.downloadFile(credentials.sftpPathToImportFiles+configFile.importFileName, callback); 
関連する問題