2013-05-13 3 views
1

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

Приведенный ниже пример, когда я вхожу в функцию «отправить», как мне получить экземпляр прототипа внутри функции отправки? как «var self = this»; в другой функции? это в этом методе относится к элементу формы.

(function ($, window, document, undefined) { 
    var PluginPrototype = { 
     init: function (options, element) { 
      var self = this; 

      $(element).find('form').submit(self.submit); 
      self.otherMethod(); 
     }, 

     submit: function(){ 
      var self = this; // the form element 
     }, 

     otherMethod: function() { 
      var self = this; // the prototype 
     }, 
    } 

    $.fn.pluginname = function (options) { 
     return this.each(function() { 
      var plugin = Object.create(PluginPrototype); 
      plugin.init(options, this); 

      $.data(this, 'pluginname', comment); 
      // Get it by 
      // $.data($(select)[0], 'comment'); 
     }); 
    }; 

    $.fn.pluginname.Settings = { 

    }; 
}(jQuery, window, document)); 
+0

В каком случае вы говорите? – Ohgodwhy

ответ

2

На самом деле, есть некоторые непонятые понятия здесь:

  1. Там нет "прототип экземпляра" в вашем случае. Прототип - это свойство функций, когда они используются как конструкторы. В вашем случае PluginPrototype - это просто простой объект, его прототипом будет Object.prototype.

  2. «это» - это словосочетание, содержащее контекст выполнения текущей функции и может быть изменено в зависимости от , как вы вызываете данную функцию.

  3. Я предлагаю прочитать немного о JQuery разработки плагинов здесь: http://learn.jquery.com/plugins/

То есть, я могу предложить типичный подход:

  1. Have все методы плагином как свойства объект «методы» (ваш текущий PluginPrototype)

  2. Im в функции $ .fn.pluginName для обработки различных запросов на выполнение.

    return this.each(function() { 
        if (methods[method]) { 
         return methods[method].apply(this, Array.prototype.slice.call(parameters, 1)); 
        } else if (typeof method === "object" || ! method) { 
         return methods.init.apply(this, parameters); 
        } else { 
         $.error("Method "+method+"does not exist on my wonderful plugin"); 
        } 
    }); 
    

    a. Инициализация плагина вызывается через $ ("..."). Plugin ({option: value, ...});

    b. Плагиновые методы вызывают через $ ("..."). Plugin ("имя метода", аргумент1, аргумент2, ...);

  3. Все методы будут вызываться с помощью «этого», указывающего на текущий элемент, состоящий из jQuery-wrapped dom; так, чтобы вызвать метод внутри другого метода вы будете ехать с:

    methods.methodName.call(this, argument1, argument2); 
    

Надеется, что это помогает.

+0

Довольно прилично сформулированный ответ «этот»! –

+0

Eheh да мой английский ужасен. Также я новичок в ответе на вопросы. Надеюсь, я получу лучше;) – sixFingers

+0

Я бы просто изменил, чтобы удалить «Надеюсь, это вам поможет». как лишний текст. –