2017-11-15 8 views
0

コンストラクタ関数のプロトタイプメソッドでは、この特性に到達することはできませんが、私はnodeJSは - (私はコンストラクタ関数のプロパティを記述しています

console.log(this) 

でindex.jsその表示されていない性質でServer.requestメソッドを呼び出したときには、{}を出力します空のオブジェクト)

コンストラクタ

function Server(){ 
    if(!(this instanceof Server)) return new Server() 

    this.actions = { // accepted actions 
    login: { 
     post: [['email', 'username'], 'password'] 
    }, 
    register: { 
     post: 'name,surname,password,email,haveLicence,licenceKey'.split(',') 
    } 
    } 
} 

要求機能

Server.prototype.request = (req /* express request object */)=>{ 
    console.log(this) // {} 
    return new Promise((r,j)=>{ 
    let action = (req.url.match(/[a-z\-]+/i) || [])[0] 

    if(!action) return r([400, 'NoAction']); 

    action = this.actions[action] // Cannot read property 'register' of undefined. 
... 
} 
+0

私はこの質問にインスピレーションを得た例を追加しました:https://stackoverflow.com/questions/34361379/arrow関数-vs-function-declaration-expressions-are-they-equivalent-exch/47318407#47318407 – loretoparisi

答えて

2

これはes6 arrow関数の性質です。彼らはthisを異なって結合する。

試してみてください。

Server.prototype.request = function(req) { 
    console.log(this) // 
    // etc. 
} 

簡単な例:

function Server() { 
 
    this.string = "hello" 
 
} 
 

 
Server.prototype.request = function(req) { 
 
    return this.string 
 
} 
 
Server.prototype.request_arrow = (req) => { 
 
    return this.string 
 
} 
 
var s = new Server() 
 

 
console.log(s.request()) 
 
console.log(s.request_arrow())

関連する問題