JS превращение функции в объект без использования «возврата» в выражении функции - PullRequest
3 голосов
/ 10 марта 2012

Я видел в фреймворке (сталкивался с ним один раз и никогда больше), где разработчик определяет модуль следующим образом:

core.module.define('module_name',function(){
    //module tasks up here
    this.init = function(){
        //stuff done when module is initialized
    }
});

так как я больше никогда не видел фреймворк, я попытался создать свою собственную версию и скопировать большинство ее аспектов - особенно то, как выглядел код. Я пытался сделать это, но я не могу вызвать init() модуля, потому что обратный вызов все еще функция, а не объект. вот почему я добавил return this

//my version
mycore.module.define('module_name',function(){
    //module tasks up here
    this.init = function(){
        //stuff done when module is initialized
    }

    //i don't remember seeing this:
    return this;
});

в mycore, я называю модуль следующим образом (с return this в определении модуля):

var moduleDefinition = modules[moduleName].definition; //the callback
var module = moduleDefinition();
module.init();

как превратить функцию обратного вызова в объект, но сохранить способ ее определения (без return this в определении обратного вызова)?

Ответы [ 4 ]

4 голосов
/ 10 марта 2012

вы должны использовать:

var module = new moduleDefinition();

и тогда вы получите объект.

О, и, возможно, вы хотите объявить init так:

this.init = function() {

Приветствие.

2 голосов
/ 10 марта 2012

Как насчет этого (я могу только предположить, как выглядит mycore):

mycore = {
  module: {
    definitions: {},
    define: function(name, Module) {
      this.definitions[name] = new Module();
      this.definitions[name].init();
    }
  }
};

mycore.module.define('module_name', function () {
  // module tasks up here
  this.init = function () {
    // init tasks here
    console.log('init has been called');
  };
});
1 голос
/ 10 марта 2012

Я не знаю, какой фреймворк вы используете или какие требования он к вам предъявляет, но сам по себе Javascript не требует, чтобы функция возвращала что-либо, даже функцию, которая определяет объект. Например:

function car(color) {
  this.myColor = color;
  this.getColor = function() {
    return this.myColor;
  }
  //note: no return from this function
}

var redCar = new car('red');
var blueCar = new car('blue');
alert(redCar.getColor());  //alerts "red"
alert(blueCar.getColor()); //alerts "blue"
0 голосов
/ 10 марта 2012

Еще одна альтернатива http://jsfiddle.net/pWryb/

function module(core){this.core = core;}
function Core(){
    this.module = new module(this);
}
Core.prototype.modules = {};

module.prototype.define = function(name, func){
  this.core.modules[name] = new func();
  this.core.modules[name].name = name;
  this.core.modules[name].init();
  // or
  return this.core.modules[name];
}

var myCore = new Core();
var myModule = myCore.module.define('messageMaker', function(){
    this.init = function(){
        console.log("initializing " + this.name);
    }
})

myModule.init();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...