построить пользовательскую функцию на основе прототипа и jquery - PullRequest
1 голос
/ 26 августа 2011

Я использовал как прототип, так и jquery.

Иногда мне приходится создавать некоторые пользовательские функции, например, я хочу создать общий класс Search, в прототипе я могу написать его так:

var Searcher=Class.create();
Searcher.prototype={
  initilize:function(xxx){},
  search:function(url,para){
    //here ,I may use some internal method,
    this._check(url,para)
  }
  _check:function(url,para){}
}

В приведенном выше коде, в методе «поиск», мне нужен метод «_check», который может быть использован повторно.Поэтому я добавляю коды в функцию "_check".

Однако, когда я хочу сделать то же самое в jquery, я не знаю, как это сделать:

(function($){
  $.search=function(xxxx){
    //how about if I want to extra some common codes to a method,where to place it?

    //here?
    function _check(xxxx){}
  }

  //or here?
  $._check=function(xxxx) {}
})(JQuery)

Кажется, чтоПрототип должен быть предпочтительным при сборке пользовательского класса util, но мне действительно нравится такой способ работы с dom, как «цепная операция», «css», .... .... 1011 *

Как вы, ребята, делаете?

1 Ответ

1 голос
/ 26 августа 2011

В jQuery это обычный шаблон частных утилит, которые может использовать ваша подключаемая функция:

(function($){
  $.search=function(xxxx){
    // You can use _check() here
  };

  function _check(xxxx) {
    // Do the work that _check does
  }
})(jQuery)

(Также обратите внимание, что j в jQuery находится в нижнем, а не верхнем регистре.)

Поскольку Я заинтересован в именованных функциях , я обычно делаю еще один шаг:

(function($){
  $.search=search;

  function search(xxxx){
    // You can use _check() here; if you want to pass on `this`, either
    // do it as an argument or do this:  _check.call(this, xxxx);
  }

  function _check(xxxx) {
    // Do the work that _check does
  }
})(jQuery)

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


Примечание: Ваш пример с прототипом устарел. Этот стиль использования Class.create восходит к v1.5. Поскольку v1.6 был выпущен (четыре года назад), вы делаете это:

var Searcher=Class.create({
  initialize:function(xxx){},
  search:function(url,para){
    //here ,I may use some internal method,
    this._check(url,para)
  }
  _check:function(url,para){}
});

Обратите внимание, как я передаю объект, определяющий методы для прототипа, в Class.create, не заменяя прототип впоследствии. Прототип v1.6 и выше сделает вам замену прототипа, который вы потеряете, если замените его. Вероятно, также стоит отметить, что ваш _check метод не является частным, любой может его вызвать. Если вы действительно хотите, чтобы это было приватно, вы можете использовать ту же технику, что и выше:

var Searcher = (function() {
  var rv = Class.create({
    initialize:function(xxx){},
    search:function(url,para){
      //here ,I may use some internal method,
      _check.call(this, url, para)
    }
  });

  function _check(url,para){}

  return rv;
})();

Обратите внимание, что способ вызова _check меняется. Вот как вы это делаете, если хотите, чтобы this означало то же самое в _check, что и в search, или вы можете просто сделать это аргументом, передаваемым _check.

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