- 浏览: 1159198 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhizhen23:
LZ 提供的链接地址失效了
重写的isPlainObject方法 -
LovingBaby:
LovingBaby 写道function fun() {}f ...
读jq之二(两种扩展) -
LovingBaby:
说的很清楚!jQuery作者为了实现简洁调用的苦心!高超的编程 ...
读jq之一(jq对象的组成) -
hard_ly:
...
将伪数组转换成数组 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,例如二十六进制、十二进制又该如何 ...
用递归实现十进制数转换N进制
第一句
window.undefined = window.undefined;
兼容IE6以下的浏览器,有人 解释过了。
定义Ext全局变量
Ext = { version : '3.1.0' };
注意这里没有使用var,不使用var声明变量被认为是不好的编程习惯,尤其是函数内声明变量不写var更被称为是无穷无尽的Bug根源。这里则不会,因为变量Ext是该库唯一的全局变量(命名空间)。其它Ext源码中的变量声明都加上了var。
给Ext添加静态apply方法,该方法是核心方法之一,会用其扩展Ext。
Ext.apply = function(o, c, defaults){ // no "this" reference for friendly out of scope calls if(defaults){ Ext.apply(o, defaults); } if(o && c && typeof c == 'object'){ for(var p in c){ o[p] = c[p]; } } return o; };
该方法有两种执行方式:
其一,只传o,c时直接将c上的所有属性/方法拷贝给o后返回;
其二,defaults也传时,会将defaults,c上的所有属性/方法都拷贝给o。这里实现的很巧妙,同时有点绕人。
三个参数都传,会执行Ext.apply(o, defaults),即自身实现中调用自身。defaults为c,即当传两个参数时会直接进行对象拷贝。举个例子一目了然,在Ext.apply中加上一个输出语句
Ext.apply = function(o, c, defaults){ // no "this" reference for friendly out of scope calls if(defaults){ Ext.apply(o, defaults); } if(o && c && typeof c == 'object'){ for(var p in c){ alert(p); // 此处是添加的输出语句 o[p] = c[p]; } } return o; }; var obj = {}, obj1 = {name:'jack'}, obj2 = {age:33}; Ext.apply(obj,obj1,obj2);
会发现先弹出age,再是name。即先拷贝defaults,再是c。
接下来是个自执行的匿名函数,执行完后给Ext上扩充许多实用属性或方法。先定义了一些局部变量idSeed,浏览器判断之类。idSeed在做Dom缓存时用到。接下来,
if(isIE6){ try{ DOC.execCommand("BackgroundImageCache", false, true); }catch(e){} }
这段代码用来解决IE6下css背景图不缓存bug,也 有人 解释过了。
接下就是一个Ext.apply(Ext,{...}),给Ext对象扩展许多实用属性及方法。
注意 Ext.isStrict 并非判断html文档模式为严格模式,而是指标准模式,如<!DOCTYPE HTML>声明会返回true。关于文档模式猛击:http://hsivonen.iki.fi/doctype ,国内的 秦歌 翻译了该篇文章。
Ext.isSecure 判断采用https或是其它。
Ext.applyIf 设计的很巧妙,它会把对象没有的属性和方法拷贝下来,已经有的则不拷贝。Ext.apply 则会覆盖已有的属性/方法。
ECMAScript 5已经发布半年多了,添加了一些新的API方法,如Array的indexOf,forEach等方法,部分新版本浏览器已经支持这些方法来,但我们想为老的浏览器扩展该方法。可能会这样写
var proto = Array.prototype; if(!proto.indexOf){ proto.indexOf = function(){ // ... } } if(!proto.forEach){ proto.forEach = function(){ // ... } }
Ext.id方法会为HTMLElement元素随机生成一个id,默认以"ext-gen"开头。
接下来是Ext.extend方法,该方法也是核心方法之一,整个ext框架继承都是以该方法来扩展的。该方法实现依赖于Ext.override,先看override
override : function(origclass, overrides){ if(overrides){ var p = origclass.prototype; Ext.apply(p, overrides); if(Ext.isIE && overrides.hasOwnProperty('toString')){ p.toString = overrides.toString; } } }
将对象overrides的所有属性/方法拷贝到类origclass的原型上。需要注意的是后面的if判断,IE中for in不能遍历对象的Object的toSting等方法,因此需要特别处理一下。我测试IE9 beta重写对象的内置方法如toString后是可用for in遍历的,见 for in的缺陷 。IE9 beta刚刚发布,不知今后Ext团队是否会修改此处的判断。
Ext.extend是js继承最经典的实现方式了,我曾经模仿其(简化版)应用在 51ditu 。
extend : function(){ // inline overrides var io = function(o){ for(var m in o){ this[m] = o[m]; } }; var oc = Object.prototype.constructor; return function(sb, sp, overrides){ if(Ext.isObject(sp)){ overrides = sp; sp = sb; sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);}; } var F = function(){}, sbp, spp = sp.prototype; F.prototype = spp; sbp = sb.prototype = new F(); sbp.constructor=sb; sb.superclass=spp; if(spp.constructor == oc){ spp.constructor=sp; } sb.override = function(o){ Ext.override(sb, o); }; sbp.superclass = sbp.supr = (function(){ return spp; }); sbp.override = io; Ext.override(sb, overrides); sb.extend = function(o){return Ext.extend(sb, o);}; return sb; }; }(),
整体浏览,可以看到 Ext.extend 的实现是通过一个匿名函数执行,执行后返回function,这个function才是真正的Ext.extend。
匿名函数中有两个私有函数io,oc。这种组织代码的方式非常简练,通过匿名函数自执行,在匿名函数中你可以做任何复杂的操作,最终的目的返回需要的接口函数或类。
有三个参数,sb、sp、overrides分别代表subClass(子类)、superClass(父类)及覆盖子类的配置参数。
以下分三种情况讨论,第一,二种情况Ext.extend的第二个参数都是对象类型
1, Ext.extend不光是用来实现类继承的,还可以用来写类,一年前 讨论 过 。
2, 用来扩展Ext库自身类,这种情况是比较频繁的
MyGridPanel = Ext.extend(Ext.grid.GridPanel, { constructor: function(config) { MyGridPanel.superclass.constructor.apply(this, arguments); }, yourMethod: function() { // etc. } });
这里以Ext.grid.GridPanel为基础,生成了一个新类MyGridPanel
3, 真正意义类继承,即第一,二个参数都是类(function)。1年前也总结过js如何实现 继承 及 工具函数 。
篇幅已经很长了,重点说下 Ext.apply, Ext.applyif, Ext.override, Ext.extend 的区别 :
Ext.apply, Ext.applyif, Ext.override 都是对对象 进行扩展的方法,Ext.extend则是对类 操作的方法。
Ext.apply 扩展时对已经存在的属性/方法会被覆盖掉, 通常用它来扩展普通对象.
Ext.applyif 扩展时不会覆盖已经存在的属性/方法,通常用它来扩展核心js,如Array.prototype,String.prototype等。
Ext.override 扩展某一个类的原型,可以覆盖toString方法。
Ext.extend 用来写类或继承,或者说用来扩展类。
- Ext.rar (9.3 KB)
- 下载次数: 126
评论
好多ib的,投了一堆新手帖
ps:那些投新手的,不知道他们是否知道extjs是什么
有了 jquery 和 ext 的源码后,我们可以多开开 js 的眼界了~~
发表评论
-
读Ext之十五(操作批量元素)
2011-02-07 09:14 2166前两篇读了Ext.Element,这篇介绍的Ext.Compo ... -
读Ext之十四(Ext元素)
2011-01-18 14:57 2147上篇读了Ext.Element的部分方法,这篇继续。El.ad ... -
读Ext之十三(Ext元素)
2011-01-16 16:57 1964终于越来越接近Ext的核心了。这篇开始Ext.Element, ... -
读Ext之十二(在各个位置插入元素)
2011-01-13 13:17 7750IE 除了发明 innerHTML这个快捷创建DOM元素(及其 ... -
Ext core 3.1.0的一个大Bug
2011-01-12 19:28 6489Ext core 3.1.0(下载地址 )中Ext.DomH ... -
读Ext之十一(通过innerHTML创建元素)
2011-01-09 22:19 2034innerHTML 这个由 IE 引入的属性成了事实标准, ... -
读Ext之十(解析JSON)
2011-01-03 11:36 4506首先,回到第一篇 。 ... -
读Ext之九(事件管理)
2010-12-08 08:39 2943Ext的事件管理非常强大。主要定义在Ext.EventMana ... -
读Ext之八(原生事件对象的修复及扩充)
2010-11-27 18:51 2255Ext库也对浏览器原生的事件对象做了包装,以保证兼容所有浏览器 ... -
读Ext之七(多任务定时管理)
2010-11-25 17:24 2757Ext.util.TaskRunner 用来管理多任务定时管理 ... -
读Ext之六(延迟任务的执行)
2010-11-24 17:36 3910Ext.util.DelayedTask类从名字上就可以看出它 ... -
读Ext之五(Dom的低级封装)
2010-11-14 12:08 2488上篇看了ext-base-event.js(E ... -
读Ext之四(事件的低级封装)
2010-11-11 17:10 3434十一前读了Ext core的Ext.js,这篇开始读ext-b ... -
读Ext之三(原型扩展)
2010-09-30 09:51 3121续上篇, Ext.ns = Ext.name ... -
读Ext之二(实用方法)
2010-09-24 16:37 4927上篇看到Ext.extend,接着往下看。 Ext.n ...
相关推荐
Linux最常用的文件系统类型之一就是EXT系列,包括EXT2、EXT3和EXT4。然而,Windows操作系统默认并不支持直接读取这些格式的分区。这时,就需要借助第三方工具来实现这一目标,例如“Windows读取Ext4分区的工具”——...
在JavaScript的世界里,异步编程是核心之一,而延迟任务的执行则是异步处理中的重要概念。本篇文章将深入探讨“延迟任务的执行”,通过分析`DelayedTask.js`这个文件,我们可以了解到如何在Ext框架中实现延迟任务。...
但有一些第三方工具可以帮助我们解决这个问题,其中之一就是Ext2Fsd。Ext2Fsd是一个免费的开源软件,专门设计用于Windows系统上读/写Linux的EXT2、EXT3和EXT4文件系统。 **Ext2Fsd的主要功能:** 1. **读写支持**...
EXT4,全称为第四代扩展文件系统(Fourth Extended File System),是Linux内核中最常见的日志文件系统之一。它继承了EXT3的特性,并引入了一些重要的改进,如更大的文件系统大小、更快的挂载和卸载速度、更高效的元...
EXT2.3是Linux操作系统中广泛使用的文件系统之一,它由Erich Boleyn和Hans Reiser在1992年开发,是EXT2(第二扩展文件系统)的改进版本,后续发展为EXT3(第三扩展文件系统)。EXT2.3官方包2.2中文手册提供了关于该...
**Ext3_2文件系统详解** Ext3_2是一种广泛使用的Linux文件系统,全称为“Extended File System version 3 second generation...尽管有更新的文件系统出现,但Ext3_2的稳定性和兼容性使其在许多场景下仍然具有实用性。
EXT2.0在当时是Linux社区广泛使用的标准文件系统之一,尤其在早期的Linux发行版中。它在EXT1的基础上增加了许多增强功能,如更大的磁盘容量支持、更高效的文件管理以及日志记录功能的缺失。 EXT2.0 的主要特点: 1...
EXT2(Second Extended File System)是Linux操作系统中广泛使用的日志文件系统之一,由 Rémy Card 在1992年开发。这个文件系统为Linux提供了强大的权限管理和磁盘空间管理功能,是Linux系统的核心组件之一。 在...
ext4是Linux系统广泛使用的日志型文件系统之一,具有高容量、高效能的特点。本篇将深入探讨如何通过C++来分析ext4文件系统,以及涉及的相关知识点。 首先,`ext4.cpp`是一个C++源代码文件,很可能包含了实现读取和...
### Ext JS框架 经验之作2000页 #### 概述 本文档旨在提供一个全面且深入的指南,帮助读者理解并掌握Ext JS框架的各个方面。Ext JS是一款非常强大的JavaScript库,用于构建交互式的Web应用程序。它以其丰富的组件库...
EXT2是Linux早期广泛使用的文件系统之一,由Rene Rebeau开发,并在1992年首次引入。它为Linux提供了基本的文件存储功能,尽管现在已经有许多更先进的文件系统(如EXT3、EXT4和XFS),但理解EXT2的原理对于学习Linux...
Douglas Crockford是JSON的推动者之一,他的这个库提供了一些JSON相关的工具函数,比如JSON.parse()和JSON.stringify(),它们分别用于解析JSON字符串和将JavaScript对象转换为JSON字符串。这些工具对于处理JSON数据...
在Linux操作系统中,文件系统的权限管理是其核心特性之一,对于理解系统操作和安全管理至关重要。在本文中,我们将深入探讨Linux文件系统、用户、用户组以及权限等方面的知识。 首先,我们要明白Linux系统的最高...
其中,"csd寄存器"是mmc工具能查看的关键组件之一。CSD(Card Specific Data)寄存器包含了EMMC存储卡的一些关键参数,如存储容量、块大小、读写速度等信息。开发者可以通过mmc工具读取CSD寄存器的内容,来了解存储...
注解是XUtils3的核心特性之一,它极大地简化了代码编写,提高了开发效率。要启用注解,首先在`Application`的`onCreate`方法中调用`x.Ext.init(this)`进行初始化。接着,在每个`Activity`的`onCreate`方法中,使用`x...
- **SET位权限**:特殊权限位之一,允许执行文件时采用文件所有者的身份权限。 - **粘滞位权限(Sticky Bit)**:另一种特殊权限位,仅当文件是目录时有效,可以防止非所有者删除文件。 #### 文件查找、压缩及...
数据恢复是IT领域中一个非常重要的分支,它涉及到如何从损坏、误删除、格式化或不可读的存储介质中恢复丢失的数据。本教程——“数据恢复扫描版教程”...记住,对数据的保护和恢复能力是衡量你IT素养的重要标准之一。
Linux是世界上最广泛使用的开源操作系统之一,它为个人用户、企业乃至超级计算机提供了强大的计算平台。这份"Linux一个经典PPT讲解"无疑是初学者探索Linux世界的理想起点。它以简洁明了的方式介绍了Linux的基础知识...
在Linux内核中,进程管理是核心功能之一。它涉及进程的创建、调度、同步和通信等过程。手册可能会详细介绍`fork()`、`execve()`、`waitpid()`等系统调用,以及进程状态的转换,如运行(Runnable)、睡眠(Sleeping)...
UNIX操作系统,自1969年诞生以来,已成为全球最广泛使用的操作系统之一,尤其在服务器和科学计算领域具有显著地位。它以其简洁、强大的命令行界面和丰富的开发工具著称,是许多现代操作系统设计的基石。 1.1 UNIX...