2015-09-19 4 views
-1

Я пытаюсь получить базовый прототип, работающий с требованиями, я посмотрел онлайн на примерах, но они, похоже, не работают (Node 4.0.0).Прототип NodeJS и требует

Я родом из JAVA фона, и я пытаюсь обернуть мою голову вокруг создания объектов и статические методы Javascript (я знаю JavaScript не ООП, но вы можете сделать это, кажется, "ООП)

//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 mm .. это странно. Вы уверены, что путь к '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. Доступ к функции с помощью прототип напрямую:

функция Player (имя) { это.имя = имя; }

// Карта 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

вашу потребность нового объекта игрока

var Player = require('./objects/Player'); 
var player = new Player(); 
player.getPlayerFromName(name) 
Смежные вопросы