`

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.

分享到:
评论

相关推荐

    ext-2.3.0+CKEditor 3.0.1+ckfinder_asp_1.4配置详解及工程源码

    <script type="text/javascript" src="ext-2.3.0/adapter/ext/ext-base.js"> <!-- ENDLIBS --> <script type="text/javascript" src="ext-2.3.0/ext-all.js"> <script type="text/javascript" src="js/...

    Extjs加jsp上传图片代码

    ext + jsp 上传图片,用commons-fileupload-1.2.jar 和commons-io-1.3.2.jar包来上传图片的,浏览upload.html即可,upload.jsp是后台上传图片代码

    JavaScript HTML内容导出Excel兼容所有浏览器

    IE浏览器下是将内容复制到Excel,需用户手动保存Excel文档 非IE浏览器可直接导出Excel文件

    EXT框架2.0中文教程.rar

    extjs是一套完整的富客户端解决方案,也因为功能完整,造成ext-all.js有400多k,请注意,这还是压缩后的大小,而且因为是基于js和css的功能实现,对客户端机器性能也有一定的要求,比如不支持ie6以下的版本。...

    ExtJs+Dwr带分页分组传参后台排序功能的grid

    Service类(RecordServiceImpl),Service接口(RecordService),分页类(ListRange.java),dwr自带(engine.js),ext自带(ext-all.js,ext-base.js,ext-all.css),(分页底部工具栏)PagingToolbar.js

    JavaScript代码因逗号不规范导致IE不兼容的问题

    在用ExtJS做前端开发的时候,发现系统可以在谷歌浏览器、火狐下正常显示,但是用IE浏览器打开就会报错,报错信息如:Expected identified, string or number。后来,检查的代码的时候发现,是由于js代码中逗号用的不...

    ext-gen:Sencha ExtGen-用于Ext JS的开放工具

    Ext JS是一个全面且安全JavaScript框架,具有包含140多种企业级UI组件的强大库,这些组件包括数据网格,数据透视网格,树,图表,D3可视化,表单,日历,按钮,菜单等。 Ext JS功能丰富的组件已预先构建和测试,...

    5ch.ext:浏览5ch.net的扩展

    5ch.ext 浏览5ch.net的扩展

    读取JS紧缩gzjs格局文件

    Ext项目Ext的插件都斗劲大,对于网页的浏览速度也是很是不容乐观的,于是就须要对所加载的js文件进行优化,此中一个办法就是对于较大的js文件可以进行紧缩。紧缩成gzjs格局,然则gzjs后缀名的文件又不克不及被浏览器...

    ExtJS判断IE浏览器类型的方法

    代码在ext里的src\core\ext.js下 最新的ext3.0beat1的代码如下: 代码如下: ua = navigator.userAgent.toLowerCase(), check = function(r){ return r.test(ua); }, isStrict = document.compatMode == “CSS1Compat...

    EXT中文API

    下载改文档,解压后,部署到自己的IIS中,然后在浏览器浏览,看一看到所有关于EXT的Demo,sample,是一个非常好的EXT自学文档,祝你学习愉快,天天向上!

    magnificat-electron:一个使用Ext JS为Electron编写的简单音乐播放器

    我本打算使用Ext JS在Electron中编写它,但此后决定改用Java FX。 为了好奇起见,保留了该存储库。 看起来是这样的: 没有二进制文件可供下载(您需要成为编程爱好者才能签出并使用它)。版本0.1 这是该应用程序的...

    解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题

    尝试过N多方法,最后发现导致出现这种问题的原因(90%以上的可能性)是js的数组中多了一个英文的逗号’,’,而这种在chrome和火狐中是没有问题的,如下面的代码所示: 代码如下: var win = Ext.create(‘Ext.window....

    web-store-js:使用sessionStorage或localStorage在Web浏览器中存储数据JavaScript库

    安装只需抓取或并将其包含在脚本标签中即可。用法 < script src =" web-store.min.js " > </ script >支持的浏览器在谷歌浏览器中测试兼容性web-store-js与Ext JS 6客户端代理兼容: 和 。

    GLITCH.ext:毛刺任何网站的虚拟外观!

    这会在浏览时向网站注入3个库( , , )和, 使您能够在ANY *网站上干扰ANY *元素... *几乎我如何得到它?手动地我建议使用此技术,以便您可以检查代码并知道要安装的内容。 下载或克隆存储库前往chrome:// ...

    extjs6.5快速开始.pdf

    欢迎来到 Ext JS 快速入门指南!在本指南中,我们将快速浏览您需要理解的最重要的核心概念,以成 为一个有效的 Ext JS 开发人员。在每一步中,我们将研究一个工作代码示例,然后讨论任何新概念。我们 将把每个部分...

    cfg-explorer:CFG二进制文件浏览器

    cfg-explorer CFG Explorer是一个简单的实用程序,可用于浏览二进制程序的控制流程图。 它使用二进制分析框架进行CFG恢复,并在的帮助下将CFG渲染为 。 可以通过单击功能或呼叫站点节点来导航生成的SVG 。 此外,...

    webglew:WebGL 扩展牧马人

    网页浏览 WebGL的èxtensionW¯¯rangler。 管理 WebGL 扩展,因此您不必这样做。 例子 var canvas = document . createElement ( "canvas" ) var gl = canvas . getContext ( "webgl" ) var ext = require ( ...

    js实现浏览本地文件并显示扩展名的方法

    本文实例讲述了js实现浏览本地文件并显示扩展名的方法。分享给大家供大家参考。具体如下: 这里用文件域浏览指定文件,可以显示该文件的扩展名,想想它可以用在哪里?可以用在文件上传系统上,用来判断上传的文件...

    chrome-niko-ext

    chrome-niko-ext 谷歌浏览器的扩展,以便在 nikoniko.co 中轻松发布 niko

Global site tag (gtag.js) - Google Analytics