Как правильно взаимодействовать с родительскими функциями / объектами внутри объекта - PullRequest
1 голос
/ 12 февраля 2012

У меня есть «основной» объект с именем Application, в котором будут храниться все мои функции, относящиеся к этому конкретному сценарию. В этом объекте есть несколько различных функций, например, start() и pause(), которые взаимодействуют с дочерним объектом.

При вызове этих функций из дочернего объекта (объекта Application или даже глубже) я должен напрямую ссылаться на Application.function(). Который может получить очень беспорядок . Это тот же случай в этих функциях, если мне нужно будет взаимодействовать с дочерними данными, this.Game.instance.sessionId. Это сделано, чтобы потерпеть неудачу, что если я добавлю еще больше объектов в будущем, когда моя потребность возрастет? Это может привести к путанице, не говоря уже о продолжительности, только при взаимодействии с другим дочерним / родительским объектом.

Пример кода:

    var Application = {     
       //Start the whole application
       start: function() {
          doSomething(this.Game.instance) //do something with the game instance object
       },

       pause: function() {
          //pause the current sessionId
          interactWithMyServer(this.Game.instance.sessionId); //clutty
       }

       Game: {  
          //redraw the game to reflect changes
          redraw: function() {
             someDrawFunction(this.instance); //draw the instance
          },

          //Stores information about the game instance from the server, changes often
          //bad example with the pause, but just to get the idea of my example
          instance: {
             gameId: 23,
             sessionId: 32,
             map: 32,

             //dummy function
             pause: function() {
             Application.pause(); //works, but I have to start with the "root" object, Application - how to avoid this?
             }
          }

      }             
   };

Извините за глупый код, просто пытался показать мою проблему.

Как структурировать это, или точнее перестроить, наиболее правильными и чистыми способами?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2012

Вы можете передать ссылку на родителя, определив некоторый метод закрытия:

var App= {


    aplicationFunction: function() {
        alert("Hello, yes this is application...");
    },

    app: this,

    getGameObj: function() {
        var _that = this;
        return {

            that: _that,

            parentF: function() {
                this.that.aplicationFunction();
            },
        };
    },
};

App.getGameObj().parentF();

Демонстрация в реальном времени: http://jsfiddle.net/vZDr2/

Для большего удобства вы можете использовать его в следующем примере:

gameobj = App.getGameObj();
gameobj.parentF();
0 голосов
/ 12 февраля 2012

Нет никаких постоянных постоянных отношений между объектами, которые могут быть определены такими способами, как вы описываете.Другими словами, объект, определенный для свойства «Game», по своей сути не связан с объектом «Application», а также «instance» не связан с «Game».Если бы вы хотели, чтобы это было так, вы бы явно указали ему свойство, которое его связывает.

  var Application = {
    // ...
    Game: {
      //redraw the game to reflect changes
      redraw: function() {
         someDrawFunction(this.instance); //draw the instance
      },

      //Stores information about the game instance from the server, changes often
      //bad example with the pause, but just to get the idea of my example
      instance: {
         gameId: 23,
         sessionId: 32,
         map: 32,
         app: null,

         //dummy function
         pause: function() {
           this.app.pause(); //works, but I have to start with the "root" object, Application - how to avoid this?
         }
      }

// ...

Application.Game.instance.app = Application;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...