2015-09-19 65 views
-1

我想要得到一個基本的原型與需求,我在網上查找的例子,但他們似乎並沒有工作(節點4.0.0)。NodeJS原型和需要

我來自一個JAVA的背景和我試圖環繞使物體和靜態方法爲Javascript(我知道JavaScript不是OOP,但你可以把它「似乎」 OOP)

我的頭
//Player.js 

var Player = function(name) 
{ 
    this.name = name; 
} 

//Map<name,Player> 
Player.prototype.playersOnline = []; 

Player.prototype.getPlayerFromName = function(name) 
{ 
    if(Player.playersOnline[name] != undefined) 
    { 
     return Player.playersOnline[name]; 
    } 
    return undefined; 
}; 

module.exports = Player; 

而且

//Main app.js 
var Player = require('./objects/Player'); 
Player.getPlayerFromName(name) << TypeError: undefined is not a function 
+0

要導出的函數,而不是對象。 – thefourtheye

回答

2

getPlayerFromName包括在樣機的問題,因此它是一個實例方法,但你使用它作爲一個靜態方法。 爲了讓靜態的方法,將它們添加到函數對象,而不是該原型:

Player.playersOnline = []; 

Player.getPlayerFromName = function(name) 
{ 
    if(Player.playersOnline[name] != undefined) 
    { 
     return Player.playersOnline[name]; 
    } 
    return undefined; 
}; 

module.exports = Player; 

用例:http://www.node-console.com/script/httpstackoverflowcomquestions32669672

注意實例不會有這些方法。

+0

該方法仍未定義。 –

+0

@iLoveUnicorns毫米。這很奇怪。你確定'Player.js'的路徑是正確的嗎?看起來它不是「需要」的。 –

+0

但是當使用'新'時,它會把所有這些功能放回到內存中嗎? –

2

你明白了吧。 Player就是你所說的Java中的「類」。所以你需要實例化它來訪問它的方法。

但是,如果你想叫什麼像一個靜態方法,你有兩種方式:

1.將靜態函數的「構造」:

function Player (name) { 
    this.name = name; 
} 

//Map<name,Player> 
Player.playersOnline = {}; 

Player.getPlayerFromName = function(name) { 
    if(typeof Player.playersOnline[name] === 'undefined') { 
     return Player.playersOnline[name]; 
    } 
    return undefined; 
}; 

2.訪問通過函數原型直接:

function Player(name){ this.name = name; }

//地圖 Player.prototype.playersOnline = {};

Player.prototype.getPlayerFromName =函數(名稱){ 如果(typeof運算Player.prototype.playersOnline [名稱] === '未定義'){ 返回Player.prototype.playersOnline [名稱]; } return undefined; };

一些注意事項:

  1. 這是更好地聲明構造函數,而不是使用函數表達式。 Read more about the difference here.

  2. 強烈建議在行尾使用開放的花括號。這不僅僅是一些編碼風格偏好,你可以通過這樣做來避免棘手的錯誤。 Read more here

  3. 順便說地圖是JavaScript對象不是數組:

    //地圖 Player.prototype。playersOnline = {}; //這將工作打算

+0

我用兩種方式更新了答案,以實現您的目標和一些筆記。 – AlexStack

2

你需要新的Player對象

var Player = require('./objects/Player'); 
var player = new Player(); 
player.getPlayerFromName(name)