Получить экземпляр / ссылку из функции прототипа jQuery ($.fn)


Я написал плагин jQuery, который использует прототип.

Пример:

  function MyWidgetConstructor(element) {

    this.id = 'test';
    this.$element = $(element);
    this.$element.data('instance', this);

  }

  MyWidgetConstructor.prototype.sayHello = function() {
    alert('Hello, my ID is: ' + this.id);
  }

  $.fn.myWidget= function() {
    return this.each(function() {
      new MyWidgetConstructor(this);
    });
  };

Я использую атрибут data для сохранения ссылки на виджет. Таким образом, я могу вызвать методы-прототипы с переменными экземпляра следующим образом:

    jQuery('#myInstance').myWidget();
    jQuery('#myInstance').data('instance').test();

Однако, это не всегда работает. Есть ли другой способ добраться до ссылки (возможно, без использования атрибута данных)?

1 2

1 ответ:

Я нашел другой подход! Для управления различными экземплярами можно использовать глобальный массив экземпляров.

Пример:

(function ($) {

    window.InstanceCollection = window.InstanceCollection || {};

    $.fn.myWidget = function () {
        return this.each(function () {
            new MyWidgetConstructor(this);
        });
    };       

    function MyWidgetConstructor(element) {
        this.id = 'test';
        window.InstanceCollection[this.id] = this;
    }

    MyWidgetConstructor.prototype.sayHello = function () {
        alert('Hello, my ID is: ' + this.id);
    }

})(jQuery)

jQuery(function ($) {
    $('#myInstance').myWidget();
    window.InstanceCollection['test'].sayHello();
})