Можете ли вы помочь мне решить эту проблему с дизайном JavaScript? - PullRequest
2 голосов
/ 24 августа 2011

У меня есть следующий код при создании объекта:

var myObject = {
    Init: function() {
        // config anything here to initiate this object.
    };
}

Где myObject.Init () работает как конструктор класса.Я использую этот метод Init () для обобщения объекта, который должен быть инициирован, в следующем шаблоне фабрики:

window[myObjectName].Init();

myObjectName - это любое имя объекта, который нужно создать.

Затем у меня есть 2-йвыбор создания объекта, для меня гораздо проще фактически превратить Init () в некий конструктор, подобный приведенному ниже:

var myObject = function() {
    // config anything here to initiate this object.
}

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

window[myObjectName]();

и практически уменьшает код myObject при подключении к нему Init () (и любого другого объекта, который я бы сделал на фабрике).

Однако 2-йя обнаружил недостаток выбора, заключающийся в том, что я не могу использовать this внутри объекта, который я на самом деле должен явно использовать myObject для вызова вещей внутри.Например:

var myObject = function() {
    myObject.doSomething(); // instead of this.doSomething();
}

Что меня беспокоит относительно ссылки на переменную / объект (пожалуйста, исправьте меня, если я ошибаюсь).

Любая помощь в преимуществах и недостатках этих выборов?какой из этих вариантов вы предпочитаете или можете предложить лучшее решение?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 24 августа 2011

Почему бы не использовать функцию конструктора?Оба предложенных вами подхода требуют, чтобы объект был создан и сохранен перед его инициализацией.Вы можете сделать это так:

function MyObject() {
  this.x = 1;
  this.y = 2;
}

Вы используете ключевое слово new для создания объектов:

window[myObjectName] = new MyObject();

Еще одно преимущество в том, что вы можете использовать прототип функциичтобы добавить методы к создаваемым объектам:

MyObject.prototype = {

  doSomething: function() {
    // do something
  }

  doMore: function() {
    // do more
  }

};
1 голос
/ 24 августа 2011

Существует несколько способов создания структур классов в js. Хотя я предпочитаю что-то вроде вашего второго примера.

var MyClass = function() {
    // define local variables
    var x = 0;
    function doSomething()
    {
       return ++x;
    }
    function doSomethingTwice()
    { 
        doSomething(); 
        doSomething(); 
    }

    // basically an export section where variables are assigned "public names"
    this.doSomething = doSomething;
    this.doSomethingTwice = doSomethingTwice;
    // careful though, this next line WON'T WORK!
    this.x = x; // because this is an assignment by value, this.x will be 0 
                // no matter how many times you `doSomething`
};
var inst = new MyClass(); // the `new` keyword is imperative here
                          // otherwise `this` won't work right.
0 голосов
/ 24 августа 2011

Второй способ на самом деле является предпочтительным.this в JavaScript не всегда ссылается на текущий объект.Вы обычно держите ссылку на свой объект, чтобы вам не пришлось полагаться на this.

Даже когда вы пишете свой код с помощью функции .Init, я, как вызывающая программа, могу переопределить это, выполнивa

window[myObjectName].Init.call(mynewthis);

В JavaScript вызывающая сторона решает, на что будет ссылаться this.

0 голосов
/ 24 августа 2011

Арли, насколько я понимаю, ты наверняка сможешь использовать this.doSomething(). Какую ошибку вы получаете в этой строке кода?

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