基于prototype和jquery构建自定义函数

时间:2011-08-26 13:34:49

标签: jquery prototypejs

我使用了protoype和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操作方式,如“chain operation”,“css”,....

你们是怎么做的?

1 个答案:

答案 0 :(得分:1)

在jQuery中,这是插件函数可能使用的私有效用函数的常用模式:

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

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

(另请注意,j中的jQuery位于较低位置,而不是大写位置。)

因为I'm keen on named functions,我通常更进一步:

(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函数对您的插件都是完全私有的,因为它的作用域是您用来封装插件的匿名函数。


旁注:您的Prototype示例已过期。 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相同的内容,或者您​​可以将其作为传递给{{1}}的参数,那么就是这样做的