- 浏览: 1173892 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhizhen23:
LZ 提供的链接地址失效了
重写的isPlainObject方法 -
LovingBaby:
LovingBaby 写道function fun() {}f ...
读jq之二(两种扩展) -
LovingBaby:
说的很清楚!jQuery作者为了实现简洁调用的苦心!高超的编程 ...
读jq之一(jq对象的组成) -
hard_ly:
...
将伪数组转换成数组 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,例如二十六进制、十二进制又该如何 ...
用递归实现十进制数转换N进制
续上篇,
Ext.ns = Ext.namespace;
有了一个简写的namespace。整个匿名函数执行完了。接下来
Ext.ns("Ext.util", "Ext.lib", "Ext.data"); Ext.elCache = {};
分别为Ext添加了util,lib,data,elCache属性,默认都是空的对象。
Ext.apply(Function.prototype, { createInterceptor : function(){ // ... }, createCallback : function(){ // ... }, createDelegate : function(){ // ... }, defer : function(){ // ... } });
Ext.apply在第一篇已经讲到,这里用来扩展Function,为其增加了四个方法createInterceptor、createCallback、createDelegate、defer。
众多流行的JS库都不同程度的“污染”了原生JS,最典型的如Prototype
,Mootools
。JQuery则完全例外,一个匿名函数执行后便诞生了集所有API为一身的强大 $ .
虽然如此,JQuery的事件对象则不是DOM中事件对象,它完全重写了一个兼容IE,DOM3的事件对象。这里的污染加了双引号,不赞同的就理解成扩展吧。
createInterceptor 方法
createInterceptor : function(fcn, scope){ var method = this; return !Ext.isFunction(fcn) ? this : function() { var me = this, args = arguments; fcn.target = me; fcn.method = method; return (fcn.apply(scope || me || window, args) !== false) ? method.apply(me || window, args) : null; }; },
Interceptor顾名思义,拦截器。它却不是Strust2中的拦截器,但还是有部分相似之处。这里是利用所传函数fcn拦截,如果fcn返回false,将被拦截,true才执行。
var method = this,因为是给Function.prototype扩展,因此其prototype上挂的所有的函数,函数内的this都是Function,即函数自身。示例可能更容易理解
Function.prototype.test = function(){ alert(this); }; function fn(){return 'test';} fn.test();
给Function.prototype添加了一个test方法,定义函数fn,fn会自动继承test方法,fn.test()时弹出的this可以看到就是fn自身。
!Ext.isFunction(fcn),这个条件表明如果所传参数fcn不是一个function,那么将直接返回this,this即函数自身。或者说这时没有进行任何拦截,原样返回了该函数自身。
当fcn为一个function时,将执行 “:”后的分支,此时给fcn添加了两个属性target,method。target是me,me是this。
此时的this是什么呢?多数情况下是window,但整个function如果作为对象属性存在时,this则是该对象。谁调用了createInterceptor,method就是谁。如:
function oldFn(){ alert('test'); } function ret(){ return false; } var newFn = oldFn.createInterceptor(ret); newFn();
oldFn继承了createInterceptor方法,且调用了它,参数是ret。这时createInterceptor内部的method, fcn.method就是oldFn;me,fcn.target则为window对象。改成如下,me,fcn.target则为obj了。
function oldFn(){ alert('test'); } function ret(){ return false; } var obj = {name:'jack'}; obj.method = oldFn.createInterceptor(ret); obj.method();
再往下看
(fcn.apply(scope || me || window, args) !== false),所传参数fcn被执行,执行上下文优先是scope,其次是me,最后是window。返回结果不等于false才执行method。method执行上下文先为me,me不存在则是window。
整个createInterceptor方法就看完了,下面是一个具体例子:
function sayName(name){ alert('hello, ' + name); } function rule(name){ return name == 'snandy'; } var sayName2 = sayName.createInterceptor(rule); sayName2('zhangsan'); // -> no alert sayName2('snandy'); // -> "hello, snandy"
createCallback 方法
createCallback : function(/*args...*/){ // make args available, in function below var args = arguments, method = this; return function() { return method.apply(window, args); }; },
这个方法非常有用,实现简单。返回一个新函数,新函数内执行method(method是谁就不用再提了吧),会把外面的参数给传进来。
初学者经常 纠结于给事件handler传参数
。createCallback 解决了给DOM事件handler(监听器)传参问题。
createCallback 不仅用在DOM事件handler上你完全可以自定义事件,设计一套属于自己的 观察者模式
API。即每个类有自己的事件,如 LTMaps
,除了拥有属性,方法还有许多事件,如移动地图(move),缩放地图(zoom)。Ext的众多UI组件也都是这种模式,Ext.Panel
具有afterlayout,close等事件。
在给这些事件添加hanlder,又想传参或许也会用到 createCallback。
再看createDelegate方法,创建一个代理函数
createDelegate : function(obj, args, appendArgs){ var method = this; return function() { var callArgs = args || arguments; if (appendArgs === true){ callArgs = Array.prototype.slice.call(arguments, 0); callArgs = callArgs.concat(args); }else if (Ext.isNumber(appendArgs)){ callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first var applyArgs = [appendArgs, 0].concat(args); // create method call params Array.prototype.splice.apply(callArgs, applyArgs); // splice them in } return method.apply(obj || window, callArgs); }; },
createDelegate 比 createCallback 更强大,除了能解决回调函数传参问题。还能控制:
1, 自定义参数是否覆盖默认参数(如 DOM事件对象
作为handler第一个参数)
2, 自定义参数的位置
内部实现:取自身(var method=this),返回一个新function,该function调用自身(method.apply),同时指定上下文(obj||window)及参数(callArgs)。就这么简单,细节之处在于对参数的控制。
1,只传obj和args时将覆盖回调函数默认参数(DOM事件对象)
<a href="#" id="aa">SINA</a> <script type="text/javascript"> var aa = document.getElementById('aa'); function sayName(name){ alert('hello, ' + name); } var sayName2 = sayName.createDelegate(aa,['jack']); aa.onclick = sayName2; </script>
2,三个参数都传,appendArgs为true时,默认参数(DOM事件对象)位置不变(第一个),自定义参数args在最后
<a href="#" id="aa">SINA</a> <script type="text/javascript"> var aa = document.getElementById('aa'); function sayName(){ alert('实际参数长度:' + arguments.length); alert('hello, ' + arguments[0]); alert('hi, ' + arguments[1]); } var sayName2 = sayName.createDelegate(aa,['jack'],true); aa.onclick = sayName2; </script>
3, 三个参数都传,appendArgs为数字时将指定自定义参数的位置
<a href="#" id="aa">SINA</a> <script type="text/javascript"> var aa = document.getElementById('aa'); function sayName(name){ alert('实际参数长度:' + arguments.length); alert('hello, ' + arguments[0]); alert('hi, '+ arguments[1]); alert('hi, '+ arguments[2]); } var sayName2 = sayName.createDelegate(aa,['jack','lily'],0); aa.onclick = sayName2; </script>
此外,method的执行上下文应该增加this,这样实用一些了。
return method.apply(obj || this || window, callArgs);
接着看defer,指定函数在多少毫秒后执行
defer : function(millis, obj, args, appendArgs){ var fn = this.createDelegate(obj, args, appendArgs); if(millis > 0){ return setTimeout(fn, millis); } fn(); return 0; }
内部实用了刚刚提到的createDelegate方法,指定函数的执行上下文及参数设定。如果millis是正数则延迟执行返回setTimeout的返回值(一个数字),有必要可用clearTimeout终止。否则立即执行,返回0。
好了,以上是对Function.prototype的扩展。接下来是对String,Array的扩展。使用Ext.applyIf,第一篇 已提到Ext.applyIf不会覆盖已有的方法。
Ext.applyIf(String, { format : function(format){ var args = Ext.toArray(arguments, 1); return format.replace(/\{(\d+)\}/g, function(m, i){ return args[i]; }); } });
给String添加静态方法(类方法)format,可以把字符串中特殊写法({0},{1})用指定的变量替换。如
var href = 'http://www.sina.com.cn', text = '新浪'; var s = String.format('<a href="{0}">{1}</a>', href, text); alert(s); // --> <a href="http://www.sina.com.cn">新浪</a>
有点类似于JSP的EL表达式。
对Array扩展,
Ext.applyIf(Array.prototype, { indexOf : function(o, from){ var len = this.length; from = from || 0; from += (from < 0) ? len : 0; for (; from < len; ++from){ if(this[from] === o){ return from; } } return -1; }, remove : function(o){ var index = this.indexOf(o); if(index != -1){ this.splice(index, 1); } return this; } });
indexOf 再熟悉不过了吧,String早有了。用来查找元素是否在数组中,如果有则返回该元素在数组中的索引,否则返回-1。该方法在 ECMAScript 5
中已经引入,各浏览器的新版本都实现了。
reomve 删除指定元素,如果存在该元素则删除,返回数组自身。
好了,以上3篇是整个Ext-core的Ext.js。
- Ext.rar (9.3 KB)
- 下载次数: 56
评论
我就特别喜欢用Ext对于时间处理的扩展方法。
发表评论
-
读Ext之十五(操作批量元素)
2011-02-07 09:14 2230前两篇读了Ext.Element,这篇介绍的Ext.Compo ... -
读Ext之十四(Ext元素)
2011-01-18 14:57 2206上篇读了Ext.Element的部分方法,这篇继续。El.ad ... -
读Ext之十三(Ext元素)
2011-01-16 16:57 2033终于越来越接近Ext的核心了。这篇开始Ext.Element, ... -
读Ext之十二(在各个位置插入元素)
2011-01-13 13:17 7797IE 除了发明 innerHTML这个快捷创建DOM元素(及其 ... -
Ext core 3.1.0的一个大Bug
2011-01-12 19:28 6540Ext core 3.1.0(下载地址 )中Ext.DomH ... -
读Ext之十一(通过innerHTML创建元素)
2011-01-09 22:19 2079innerHTML 这个由 IE 引入的属性成了事实标准, ... -
读Ext之十(解析JSON)
2011-01-03 11:36 4557首先,回到第一篇 。 ... -
读Ext之九(事件管理)
2010-12-08 08:39 2992Ext的事件管理非常强大。主要定义在Ext.EventMana ... -
读Ext之八(原生事件对象的修复及扩充)
2010-11-27 18:51 2304Ext库也对浏览器原生的事件对象做了包装,以保证兼容所有浏览器 ... -
读Ext之七(多任务定时管理)
2010-11-25 17:24 2795Ext.util.TaskRunner 用来管理多任务定时管理 ... -
读Ext之六(延迟任务的执行)
2010-11-24 17:36 3958Ext.util.DelayedTask类从名字上就可以看出它 ... -
读Ext之五(Dom的低级封装)
2010-11-14 12:08 2565上篇看了ext-base-event.js(E ... -
读Ext之四(事件的低级封装)
2010-11-11 17:10 3505十一前读了Ext core的Ext.js,这篇开始读ext-b ... -
读Ext之二(实用方法)
2010-09-24 16:37 4974上篇看到Ext.extend,接着往下看。 Ext.n ... -
读Ext之一(实用方法)
2010-09-24 10:19 4072第一句 window.undefined = window. ...
相关推荐
EXT样式页面原型是一种基于Web的用户界面设计,它利用了CSS(层叠样式表)、HTML的DIV元素以及JavaScript技术来构建高效、可扩展且交互性强的网页应用。EXT是一个前端框架,尤其在企业级应用中广泛应用,因为它提供...
"Ext继承和扩展"是ExtJS中的核心概念,它们是实现代码复用和模块化设计的关键。在这个主题中,我们将深入探讨这两个概念以及它们在实际开发中的应用。 **一、Ext继承** 在面向对象编程中,继承是类之间的一种关系...
函数的原型扩展 组件的使用: Tab标签页 Ext 1.x中的布局 Grid组件初学 Grid的数据分页 Ext菜单器件 表单组件初学 表单组件初学(二) Cookie的存储 Ext Grid+JScript ASP+Access教程 Ext 2联动Combos的教程 采用...
EXT2.0、EXT4.0 和 JS 是计算机科学领域中的三个重要概念,它们分别代表了Linux文件系统、JavaScript编程语言以及JavaScript库EXT JS的相关版本。 EXT2.0是Linux操作系统下的一种文件系统,它是EXT(第二扩展文件...
EXT4,全称为Fourth Extended File System,是Linux操作系统中广泛使用的日志文件系统之一,它在2008年被引入Linux内核。EXT4在EXT3的基础上进行了多项改进,以提升性能、可靠性和可扩展性。这个源码包包含了EXT4...
- 如果有,则获取原始类的原型对象,并使用`Ext.apply`方法将新的属性合并到原型对象中。 - 特别地,如果在Internet Explorer浏览器下且`overrides`中定义了新的`toString`方法,那么将覆盖原型对象上的`toString`...
`Ext.extend`会将`SuperClass`的原型(`SuperClass.prototype`)复制到`MyClass`的原型上,然后在`MyClass`的原型上添加指定的扩展对象中的方法和属性。 需要注意的是,当你在子类中重写父类的方法时,必须确保调用...
**三、Element:EXT JS的核心** EXT JS的核心是Element,它提供了对DOM元素的操作接口,使得JavaScript操作DOM变得更加简洁高效。Element支持获取多个DOM节点,响应事件,以及使用各种Widget,从而极大地提升了Web...
在Pencil中,EXT插件是一个非常重要的扩展,它专为设计EXT风格的图形而设计,EXT是一种流行的JavaScript库,用于构建富互联网应用程序(RIA)。EXT插件使得设计师能够以EXT库特有的组件和布局方式来构建界面原型,极...
然后,运行`ext_skel`命令,指定扩展名`--extname`,并根据提示创建扩展骨架。例如: ``` #: ./ext_skel --extname=hexin_test --proto=hexin_test.def ``` 这将生成一个基础的扩展结构,包括头文件、源文件和配置...
“EXT可视化界面原型”指的是使用专门的工具或平台,通过拖放和配置组件的方式,快速设计并生成EXT应用程序的界面原型。这种方式大大减少了手动编写HTML和CSS的时间,提高了开发效率,同时使得非编程背景的设计人员...
当我们调用`Ext.extend(C, S, {s1: "by c overload"})`时,`C`就继承了`S`的所有原型属性,包括`s`和`s1`。然而,`s1`被子类中指定的对象属性覆盖,所以当我们访问`c.s1`时,输出的是"by c overload",而不是原始的...
在使用EXT框架构建的项目中,`Ext.data.Store`是用于管理数据的核心类之一。它提供了存储、检索、排序等功能。默认情况下,`Ext.data.Store`支持基本的数据类型(如数字、字符串)的排序,但对于复杂的排序需求...
EXT4是Linux操作系统中广泛使用的文件系统之一,它在稳定性和性能方面表现出色。这个"EXT4实现的经典系统静态例子"提供了一个EXTJS4的实现示例,EXTJS是一个强大的JavaScript库,主要用于构建富客户端的Web应用程序...
5. **事件系统**:EXT 2.0采用发布/订阅模式的事件系统,使得组件间的交互变得简单且可扩展。 6. **表单处理**:EXT 2.0提供了丰富的表单控件和表单处理功能,支持验证、远程提交等。 7. **树形结构**:EXT 2.0的...
多态(Mixins)是Ext 4的一个亮点,它允许将新的功能“混入”到现有类的原型中,增强了类的功能扩展性。通过`mixins`配置项,开发者可以在不改变原有类结构的情况下,为类添加额外的功能。 总结来说,Ext 4在兼容性...
对于初学者,这是一个很好的学习资源,而对于有经验的开发者,它可以作为快速原型设计或项目开发的基础。记得在使用过程中,根据自己的需求调整和扩展框架,同时保持对数据库和后端服务的适配,以实现完整的功能。
Ext4是Linux内核中广泛使用的文件系统之一,以其高效、可靠和可扩展性而闻名。这个API中文版的发布,使得中文使用者能更方便地理解和应用Ext4的相关功能。 首先,我们来探讨一下Ext4文件系统的基本概念。Ext4是...