Как добавить noConflict в шаблон модуля JS? - PullRequest
1 голос
/ 08 сентября 2010

Я использую следующий шаблон в моем JS:

var lib =
{
  module_one:
  {
      init: function () {
          ...
      }
  },
  module_two:
  {
      init: function () {
          ...
      }
  }
};

Вопрос в том, как лучше всего добавить:

(function ($) {          
  ...
})(jQuery);

Я пытался поместить его в var lib,но это не сработало.Чтобы добавить его внутри каждой функции работал, но кажется немного грязным ..?

Можно ли как-нибудь добавить его в init: function ($)?

Совершенно новое в jQuery, поэтому, если у вас есть какие-либо другие предложения по поводу этого шаблона, дайте мне знать :-)

1 Ответ

3 голосов
/ 08 сентября 2010

В принципе, вы можете сделать это:

(function() {
    var global, lib, oldlib;

    // We call this anonymous scoping function directly, so we know that
    // within it, `this` is the JavaScript global object. Grab a
    // local reference to it so we can use it within functions that get
    // called via dotted notation and so have different `this` values.
    global = this;

    // Remember any value that already exists for the `lib` property
    // of the global
    oldlib = global.lib;

    // Define our lib, assigning it to a local variable
    lib = {
        /* ...your stuff as usual, plus: */

        noConflict: function() {
            global.lib = oldlib;
            return lib;
        }
    };

    // Publish our lib externally on the global object
    global.lib = lib;
})();

... который затем можно использовать так:

var alias = lib.noConflict();

Вот как это работает:

  1. Мы определяем функцию определения объема, а затем немедленно вызываем ее.
  2. В пределах функции видимости мы берем значение this как переменную с именем global. Это будет глобальный объект JavaScript из-за способа вызова функции определения объема. (Глобальный объект в браузерах - window, но нет необходимости ограничивать это браузерами, следовательно, получая global таким образом).
  3. Первое, что мы делаем, это сохраняем любое старое значение, которое имело свойство lib глобального объекта, в локальной переменной в нашей функции определения масштаба, называемой oldlib.
  4. Мы установили наше новое значение для lib.
  5. Наша функция noConflict восстанавливает предыдущее значение свойства lib и возвращает нашу ссылку на lib, чтобы кто-то мог использовать ее в качестве псевдонима.

Кстати, когда вы используете функцию определения масштаба, вы также можете переключиться на использование именованных функций, а не анонимных, что имеет ряд преимуществ . Выше обновлено использование именованной функции для noConflict.

(function() {
    var global, lib, oldlib;

    // We call this anonymous scoping function directly, so we know that
    // within it, `this` is the JavaScript global object. Grab a
    // local reference to it so we can use it within functions that get
    // called via dotted notation and so have different `this` values.
    global = this;

    // Remember any value that already exists for the `lib` property
    // of the global
    oldlib = global.lib;

    // Define the functions for our lib. Because they're defined
    // within our scoping function, they're completely private
    function lib_noConflict() {
        global.lib = oldlib;
        return lib;
    }

    // Define our lib, publishing the functions we want to be public
    lib = {
        /* ...your stuff as usual, plus: */

        noConflict: lib_noConflict
    };

    // Publish our lib externally on the global object
    global.lib = lib;
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...