Статические переменные a jQuery Plugins; как создать? - PullRequest
5 голосов
/ 10 марта 2010

Каков наилучший способ создания статических переменных для плагинов jQuery?

У меня есть 2 примера использования, чтобы проиллюстрировать мое мышление; каждый с некоторыми идеями.
Любые другие идеи приветствуются, конечно ...

Один из примеров - статическая переменная, содержащая: настройки анимации, настройки макета, сведения о продукте и т. Д .; другой для статических переменных, кеширующих данные.

Я надеюсь, что «static» - правильная терминология здесь ... отдельные глобалы. пожалуйста исправьте если не так.

Случай 1: для настроек

// defining globally
var anObject = {
 value1 = 0;
 value2 = 0;
}

jQuery.anObjectSet(partialObject) {
 anObject = jQuery.extend(anObject, partialObject);
}

jQuery.fn.myPlugin = function (partialObject) {
 obj = jQuery.extend(anObject, partialObject);
}

или, может быть?

// adding to the jQuery object
jQuery.anObject = {
 value1 = 0;
 value2 = 0;
}

jQuery.anObjectSet(partialObject) {
 jQuery.anObject = jQuery.extend(jQuery.anObject, partialObject);
}

jQuery.fn.myPlugin = function (partialObject) {
 obj = jQuery.extend(jQuery.anObject, partialObject);
}

или, может быть?

jQuery.anObjectSet(partialObject) {
 if(!jQuery.anObject) 
  jQuery.anObject = {
    value1 = 0;
    value2 = 0;
  }

 jQuery.anObject = jQuery.extend(jQuery.anObject, partialObject);
}

jQuery.fn.myPlugin = function (partialObject) {
 if(!jQuery.anObject) 
  jQuery.anObject = {
    value1 = 0;
    value2 = 0;
  }
 obj = jQuery.extend(jQuery.anObject, partialObject);
}

Случай 2: для кэширования

jQuery.fn.myPlugin = function (newObject) {
 if(!cache[newObject])
  cache[newObject] = $(newObject);

 return cache[newObject];
}

или может быть? (Я видел этот метод в другом месте)

window.$cache = {};

jQuery.fn.myPlugin = function (newObject) {
 if(!$cache[newObject])
  $cache[newObject] = $(newObject);

 return $cache[newObject];
}

Спасибо. Я хочу создать библиотеку .js, чтобы начать правильный путь ...

1 Ответ

12 голосов
/ 10 марта 2010

Если вы хотите создать «глобальную» или статическую переменную для вашей библиотеки и только для вашей библиотеки, закрытие - это путь.

Обычный глобал - это плохо, потому что он загрязняет пространство имен, и вы не представляете, кто будет управлять вашей библиотекой.

Определяя статическую переменную внутри анонимной функции, мы даем себе доступ к переменной, к которой никто не может прикоснуться, и которая фактически является "глобальной" для целей наших функций. Если я правильно понимаю, что вы пытаетесь сделать, это должно быть выполнено.

(function($){
    var $cache = {};

    jQuery.fn.myPlugin = function (newObject) {
      if(!$cache[newObject])
        $cache[newObject] = $(newObject);

      return $cache[newObject];
    }

})(jQuery);

* * 1008 Edit: * * 1010

Переменная $cache будет доступна только для функций, определенных в этой анонимной функции. Поэтому, если другим функциям необходим доступ к этому файлу, они также должны быть определены внутри этой анонимной функции.

Единственная альтернатива определению всего здесь (AFAIK) - иметь некоторую комбинацию функций доступа, простую функцию, определенную внутри этого замыкания, целью которой является обеспечение доступа внешних функций к $cache.

Предпочтительно, я бы пошел с определением необходимых функций внутри этого замыкания. Однако это, в конечном счете, деталь реализации, и это на ваше усмотрение.

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