2014-02-11 3 views
0

Я пытаюсь создать класс, который в его конструкторе использует некоторые вспомогательные функции. Есть ли способ переместить этих помощников в прототип? Проблема заключается в том, что конструктор выполняет некоторые асинхронные вызовы в базу данных, и мне нужно, чтобы приложения выполняли функцию обратного вызова, поэтому я могу продолжить выполнение после того, как данные были восстановлены.Javascript Proper Class constructor

Я хочу переместить материал в прототип, потому что, если я правильно понял, эти функции не привязаны к одному объекту, поэтому, если у меня есть несколько объектов, они будут по-прежнему вызывать один и тот же код, но с другим контекстом.

Class = function(id, callback) { 
    var that = this, 
     addCore = function(err, model) { 
      that.id = model._id 
      that.core = model 
      callback(err, that) 
     }, 
     addTopology = function() { 

     } 

    if (arguments.length === 2) { 
     gameOps.findById(id, addCore) 
    } else { 
     callback = id 
     gameOps.create(addCore) 
    } 
} 

Class.prototype = { 
    addPlayer: function(player, callback) { 
    gameOps.addPlayer(player, this.model, callback) 
    } 
} 

ответ

1

Я хочу, чтобы переместить материал к прототипу, потому что, если я правильно понял, то эти функции не привязаны к одному объекту, так что если у меня есть несколько объектов, они все равно будут называть один и тот же код, но с разными контекст.

Да. Однако это не то, что вы хотите: асинхронные обратные вызовы нуждаются в для привязки к конкретным экземплярам.

Если вы не хотите иметь слишком много вещей, плавающие вокруг конструктора, вы можете пересмотреть свой дизайн:

function Class(model) { 
    this.id = model._id; 
    this.core = model; 
} 
Class.prototype.addPlayer = function(player, callback) { 
    gameOps.addPlayer(player, this.model, callback); 
}; 
Class.fromDatabase = function(id, callback) { 
    function addCore(err, model) { 
     if (err) 
      callback(err); 
     else 
      callback(null, new Class(model)) 
    } 
    function addTopology() { 
    } 

    if (arguments.length === 2) { 
     gameOps.findById(id, addCore) 
    } else { 
     callback = id 
     gameOps.create(addCore) 
    } 
} 
+0

Это хорошо, но теперь не могу передать обратный вызов конструктора? – Pio

+0

ОК, я вижу, это немного сложно. Поэтому я создаю класс, вызывая Class.fromDatabase, и я возвращаю свой объект в качестве второго аргумента обратного вызова? – Pio

+1

Да, точно. Экземпляр не создается мгновенно, но доступен только для обратного вызова. Это чище, так как у вас нет неинициализированных экземпляров, плавающих вокруг, и защищает лучшее асинхронное программирование. Он также хорошо переводится в абзац Обещания. – Bergi

Смежные вопросы