我使用了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”,....
你们是怎么做的?
答案 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}}的参数,那么就是这样做的