widget是jqueryui 提供的内置插件模式,前面我曾经写过一篇文章 对jQuery做的修改 其中:
这里有必要对原因作以下说明,为什么我会抛弃widget的扩展模式
widget 可能在设计之初的时候,jquery的开发者可能一直想把所有的事件都设定为脚本绑定,而不是用javascript:obj.method();void(0); 这种模式,这也就出现了我们无法直接调用tabs的swidth的方法的现象,而必须通过tabs.tabs("swidth",args) 的条用方法,然而,这种调用方法还有一个弊端:无法返回数据,只能返回jquery对象本身,我不太清楚jquery为什么会这么做,是因为要和juqery的 fn 插件模式保持一直,还是为了保持jquery是用的简易性、连贯性(可能性比较大),但是不管怎么说,这都导致了再是用jquery进行开发中,开发人员有意识或者无意识的在js代码中使用大量的绑定行为,这就会使我们的HTML代码可阅读性降低,因为我们会再开发的过程中,为了绑定而添加大量的selector认知符,比如id,class ,而这些可能是没有任何意义的(我是这样认为的),关键的问题在于:大家都知道在IE中,循环绑定事件是可能造成内存泄露的,而且有很多人曾经这么做或者现在还在做(包括我自己)。
虽然绑定行为并不是罪大恶极,而且如果可能,我们要推荐这种方法;
但是事实是残酷的,目前为止对于大部分的项目而言,这种做法是不利的,带来的负面效果远远大于所给我们带来的优势,我们不能纯粹为了追究技术的极致而忽略了实际需要...
所以,就有了 对jQuery做的修改 一文,目的在于简化jquery的扩展模式,在保持是用jquery优势的情况下,规避一些不必要的风险
下面是base.js 包
; (function($){ /* 对闭包的扩展,是用方式为 function(arg1){...}.bind(obj,arg1);可参考prototype.js中的bind */ Function.prototype.bind = Function.prototype.bd = function(){ var method = this ; var obj = arguments[0]; var args = arguments; return function(){ var newArgs = []; var i ,len = args.length ; if(len > 1){ for(i = 1; i < len ; i ++){ newArgs.push(args[i]); } } len = arguments.length ; for(i = 0 ; i < len ; i ++){ newArgs.push(arguments[i]); } method.apply(obj,newArgs); } }; /* 对象创建方式,使用constructor init */ window["class"] = window.clazz = { create:function(){ function klass(){ this.init.apply(this, arguments); } if (!klass.prototype.init) klass.prototype.init = function(){} ; klass.prototype.constructor = klass ; return klass ; } }; })(jQuery);
希望这篇文章能给大家带来一些帮助...