`

Ext.js浏览

阅读更多

1 window.undefined = window.undefined;

  在较老的浏览器中,如IE5之前的浏览器,undefined并不是window对象的一个子对象,并不是一个已实现的系统保留字,而是代表一个未定义类型,除了直接赋值和typeof()之外,其它任何对undefined的操作都将导致异常。如果需要知道一个变量是否是undefined,只能采用typeof()的方法:如var v;if (typeof(v) == 'undefined') {// ...}。如果使用if(a==="undefined")则会报“undefined未定义”的错误。
  因此为了兼容IE5及之前的浏览器,我们可以使用一些方法来解决这个问题。本文前面说到的就是其中一种方式。window.undefined=window.undefined;咋一看很难理解,写法有点bt,但理解一下就不觉得奇怪了,在较早的浏览器中因为window.undefined不存在所以会返回undefined,将此赋给等号前的window.undefined这样后面就可以直接使用if(a==="undefined")的判断方式了。在新版本的浏览器中window.undefined=undefined;因此不会造成什么负面影响。

  除了使用window.undefined=window.undefined和window["undefined"]=window["undefined"]外,还有很多别的办法来实现对IE5及之前浏览器的兼容,如
  var undefined = void null;  //void函数永远返回undefined
  var undefined = function(){}();
  var undefined = void 0;
  只要等号后的表达式返回undefined即可。

 

2 Ext.apply
/**
 * 将config对象的所有属性拷贝到obj对象。
 *参数:
 obj : Object 接收属性的对象
 config : Object 提供属性的对象
 defaults : Object 一个不同的对象,属性可以作为默认值被拷贝。
 *返回值:
 Object
 returns obj
 */
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;
};

 

3/**
  *作用:是
  */
(function(){
 相关处理代码
 ......
})();
大家知道小括号的作用吗?小括号能把我们的表达式组合分块,并且每一块,也就是每一对小括号,都有一个返回值。这个返回值实际上也就是小括号中表达式的返回值。所以,当我们用一对小括号把匿名函数括起来的时候,实际上小括号对返回的,就是一个匿名函数的Function对象。因此,小括号对加上匿名函数就如同有名字的函数般被我们取得它的引用位置了。所以如果在这个引用变量后面再加上参数列表,就会实现普通函数的调用形式。
function(){相关处理代码......}申明了一个匿名函数,()返回匿名函数对象的引用,后面一个(),调用对象。

 

4 Ext.extend函数

JavaScript继承实现一:
js call() 方法:
Class1.call(this) 的 意思就是使用 Class1 对象代替this对象,那么 Class2 中不就有Class1 的所有属性和方法了吗。

function Person(name,food){
     this.name=name;
     this.eat=function(){
     alert(name+" eat "+food);
     }
 }
 function Boy(food){
     Person.call(this,"boy",food);//调用父类的构造方法
 }
 function Girl(food){
     Person.call(this,"girl",food);//调用父类的构造方法
 }
 var b=new Boy("fish");
 b.eat();

JavaScript继承实现二:
(1) prototype constructor

RectAngle=function (width,height){
     this.width=width;
     this.height=height;
}
RectAngle.prototype.area=function(){
     return this.width*this.height;
}
每个函数都有一个prototype属性,构造函数也是函数,所以也有prototype属性。prototype属性在定义函数的时候会自动创建并初始化.也就是说,在写下RectAngle=function(widht,height){//...}的时候,RectAngle的prototype属性就已经被创建了,这个时候prototype里面只有一个属性,它就是constructor(构造器),这个constructor指回了RectAngle函数本身。
对于每个RectAngle的实例来说,例如var rect=new RectAngle(10,10); rect.prototype会指向构造函数RectAngle的prototype,也就是说所有的实例都会共享同一份RectAngle.prototype,
如此,就不需要分配那么多内存给每个实例来存储prototype属性了。

(2) js通用继承方式:
RectAngle=function(w,h){
    this.w=w;
    this.h=h;
}
RectAngle.prototype.area=function(){
    return this.w*this.h;
}
  写个子类来继承RectAngle,这个子类叫做有颜色的矩形ColoredRectAngle,多一个color属性。
ColoredRectAngle=function(color,w,h){
    RectAngle.call(this,w,h); //继承属性
    this.c=color;
}

  上面已经把w和h属性拷贝到子类中来了,父类的prototype里面还有个area方法也得想办法拷贝进来,注意了,这是精彩的部分,不能错过哦。

  ColoredRectAngle.prototype=new RectAngle();//这个写法其实包含了很多内容哦,我们把它拆开来写会更好理解

  var rect=new RectAngle();

  ColoredRectAngle.prototype=rect;//怎么样,含义是一样的吧?

  好,开始分析这两句话。rect是RectAngle的实例(废话,它是由RectAngle构造函数构造出来的,当然是它的实例了!),但是

  在构造rect的时候,没有传参数给它,这样的话在rect这个对象里面w和h这两个属性就是null(显然必须的)。

  既然rect是RectAngle的实例,那么它的prototype会指向RectAngle.prototype,所以rect对象会拥有area()方法。

  另外,rect.prototype.constructor指向的是RectAngle这个构造函数(显然必须的)。

  好,现在ColoredRectAngle.prototype=rect,这一操作有三个问题,第一,rect的w和h被放到ColoredRectAngle.prototype里面来了,第二,rect.prototype.area()这个方法也到了ColoredRectAngle.prototype里面了,当然,完整的访问area()方法路径应该是ColoredRectAngle.prototype.prototype.area(),但是因为JavaScript的自动查找机制,放在prototype里面的属性会被自动找出来(加入从对象的直接属性里面找不到的话。)这样就没有必要写完整的访问路径了,直接写ColoredRectAngle.area()就可以找到area()了,看上去就好像ColoredRectAngle也拥有了area()方法。

  值得注意的一点是,在执行RectAngle.call(this,w,h);这一步的时候我们已经把w和h两个属性拷贝到ColoredRectAngle里面了,这里我们不再需要rect里面这两个值为null的w和h,

  所以,直接把它们删除了事,免得浪费内存。

  Delete ColoredRectAngle.prototype.w;

  delete ColoredRectAngle.prototype.h;

  OK,到了这一步,看起来模拟继承的操作就算大功告成了,父类RectAngle的w和h属性通过RectAngle.call(this,w,h)拷贝进来了,父类prototype里面的方法也拷贝进来了,没用的废物(rect里面,也就是ColoredRectAngle.prototype里面,值为null的w和h)也剔除掉了。

  看上去世界一片和谐。但是...还有一个暗藏的问题,请看:第三:这个时候ColoredRectAngle类的constructor指向错了。

  本来,如果没有ColoredRectAngle.prototype=rect这步操作,ColoredRectAngle.prototype就是JavaScript自动创建出来的那个prototype,这个prototype有个constructor,指向了ColoredRectAngle构造函数自己.

  但是,现在ColoredRectAngle.prototype=rect,如果现在来访问ColoredRectAngle.prototype.constructor,那么,根据自动查找机制,会找到rect.prototype.constructor,但这个constructor指向的是父类RectAngle构造函数,这个就不符合prototype的游戏规则了。因为,如果此时

var coloredRectAngle=new ColoredRectAngle('red',10,10) alert(coloredRectAngle.constructor);

  得到的是父亲RectAngle的构造函数,从面向对象的观点看,这个结果是可以理解的,毕竟,子类对象也可以看成是父类对象。

  但是,这样的话对于ColoredRectAngle的实例来说,就不能确切地知道它的constructor是ColoredRectAngle了。

  所以,需要手动地把ColoredRectAngle.prototype.constructor设置回来。于是有了这一步:ColoredRectAngle.prototype.constructor=ColoredRectAngle.

分享到:
评论

相关推荐

    extjs-Ext.ux.form.LovCombo下拉框

    另一方面,“火狐下div不显示背景色的问题”可能涉及到CSS的渲染差异,`Ext.ux.form.LovCombo`对此进行了修正,使得下拉框在火狐浏览器中能正确显示背景色,提供良好的用户体验。 标签中包含的“eztjs多选单选...

    Ext.js(YuiGrid的学习)

    EXT.js 是一个强大的JavaScript库,专门用于构建富客户端应用程序,尤其在Web应用的用户界面设计上表现出色。YuiGrid是EXT.js中的一个组件,它提供了数据网格的功能,允许开发者展示大量结构化数据,并实现诸如排序...

    ext.jsb2.rar

    Ext.jsb2是一款针对JavaScript开发的插件,主要用于提高在Eclipse或MyEclipse集成开发环境中编写Ext JS代码的效率。这款插件提供了强大的代码自动完成、错误检查和调试功能,使得开发者在处理复杂的前端应用时能更加...

    Ext.ux.form.ColorPickerFieldPlus 老外重写调色版

    5. **JavaScript文件**:`Ext.ux.form.ColorPicker.js` 和 `Ext.ux.form.ColorPickerFieldPlus.js` 分别是`ColorPicker`的基础组件和增强版本。前者可能包含了通用的颜色选择逻辑,而后者则是在此基础上添加了更多...

    ExtJS4+Accordion+SERVLET/STRUTS2+JSON+Ext.tree.Panel实例

    用户可以通过折叠和展开Accordion面板浏览不同分类,而Ext.tree.Panel则提供了一种直观的方式来展示和操作层级结构的数据。这种技术组合在企业级应用开发中非常常见,能够提供高效、用户友好的界面体验。

    EXTJS3 Ext.PagingToolbar() 快捷键应用

    在EXTJS3中,`Ext....通过以上分析,我们可以看出,`EXTJS3`中的`Ext.PagingToolbar`结合快捷键应用,可以显著提升数据浏览的效率和用户体验。熟练掌握这种技巧,将有助于开发出更高效、易用的EXTJS应用程序。

    chrome.ext.7z下载

    【Chrome.ext.7z下载】是一款专为Chrome浏览器设计的扩展程序压缩包,它包含了用于增强或优化Chrome浏览器功能的各类插件或者脚本...同时,了解Chrome扩展的工作原理和安全注意事项,也是保障网络浏览体验的重要一环。

    Ext表格列锁定+多表头插件

    这个插件主要用于改进Ext Grid的用户体验,特别是处理大量数据时,通过列锁定和多表头功能,使得用户能够更有效地浏览和操作数据。 首先,"列锁定"是Ext Grid中一个非常实用的功能,特别是在显示宽广、多列的数据表...

    ext图片批量上传源码

    EXT是基于JavaScript的富客户端应用框架,主要用于构建复杂的Web应用程序。在本案例中,"ext图片批量上传源码"指的是使用EXT库实现的一种用户界面组件,允许用户批量上传图片文件。EXT.ux.UploadDialog是EXT扩展库中...

    目录树(Ext.2.0)

    目录树(TreePanel)是Ext.js中的一个重要组件,它允许用户以树形结构展示和操作数据,常用于文件系统、组织架构或层级关系的展现。 在这个项目中,"目录树"很可能是一个用Ext.2.0实现的功能模块,用户可以通过这个...

    Ext常用方法录.pdf

    Ext是一个功能强大的JavaScript库,提供了许多实用的方法来简化开发工作。下面是Ext常用方法的概述: 一、 Ext核心方法 1. Ext.isEmpty(v, allowBlank):判断对象是否为空,allowBlank参数可选,表示是否允许为空...

    DWR方式动态加载EXT.Tree

    EXT TreePanel 是EXT JS库中的一个组件,它用于展示层次结构的数据,通常以树形结构显示,广泛应用于文件系统、组织结构或者菜单的展示。而DWR则是一种允许JavaScript在浏览器端与服务器端进行异步通信的技术,它...

    ExtJs3.* 分页树 Ext.ux.tree.PagingTreeLoader

    `PagingTreeLoader.js`文件中包含了`PagingTreeLoader`类的实现,它继承自`Ext.tree.TreeLoader`,并添加了分页相关的逻辑。这个文件是这个功能的核心,通过分析和调试这个文件,你可以更深入地理解其内部机制。 在...

    extjs前台分页插件PagingStore!

    在ExtJS 3.x版本中,PagingStore是与GridPanel结合使用,使得用户可以逐页加载和浏览数据,而无需一次性加载所有记录,从而减轻服务器压力。 PagingStore的工作原理: 1. **连接数据源**:PagingStore通常与远程...

    Extjs4 下拉树 TreeCombo

    当用户展开ComboBox时,内部的TreeView显示,用户可以浏览和选择树形结构中的节点。一旦用户选择了某个节点,ComboBox的输入框将显示所选节点的文本。 实现这个功能的关键步骤包括以下几个方面: 1. **设置ExtJS库...

    EXT-JS Grid 用法

    EXT-JS Grid是EXT-JS库中的一个核心组件,它被广泛用于展示和操作大量数据。Grid提供了一种高效、可定制的表格视图,允许用户进行数据浏览、排序、筛选、分页以及编辑。EXT Designer是Sencha公司提供的一个可视化...

    磁盘目录树(EXT-js)

    【磁盘目录树(EXT-js)】是一种使用EXT-js库构建的前端应用,它主要用于在Web界面中展示计算机硬盘上的目录结构,使用户能够像在操作系统中那样浏览、选择和操作文件夹。EXT-js是一个强大的JavaScript组件库,提供...

    extTree例子点击出现等

    ExtTree是Ext JS库中的一个组件,用于创建和展示树形结构的数据。它在Web应用程序中广泛使用,特别是在需要组织和导航层次结构信息时。在本案例中,“extTree例子点击出现界面”指的是用户在浏览ExtTree时,通过点击...

    Extjs4下拉树菜单ComboBoxTree支持单选和多选并且支持展开选中指定节点的通用控件

    ExtJS4是一款强大的JavaScript框架,用于构建富客户端Web应用程序。在这个特定的情况下,我们讨论的是一个定制的下拉树菜单控件——ComboBoxTree,它在ExtJS4中实现了单选和多选功能,并且具备展开选中指定节点的...

Global site tag (gtag.js) - Google Analytics