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

我使用了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”,….

你们是怎么做的?

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

 (function($){ $.search=function(xxxx){ // You can use _check() here }; function _check(xxxx) { // Do the work that _check does } })(jQuery) 

(另请注意, jQuery中的j在较低的情况下,而不是在较高的情况下。)

因为我热衷于命名函数 ,所以我通常更进一步:

 (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这种使用方式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的方式会发生变化。 这就是你如何做到这一点,如果你想在_check表示与search相同的东西,或者你可以将它作为传递给_check的参数。