`
jljlpch
  • 浏览: 324032 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

深入剖析ExtJS 2.2实现及应用连载 :类的继承(1)

阅读更多

3.2.2类的继承

深入剖析ExtJS 2.2实现及应用连载  版权所有,转载标明出处和作者及版权信息

作者:彭仁夔 QQ546711211  Blog:http://www.cnblogs.com/jxnuprkhtttp://jljlpch.iteye.com

javaScript中,面向对象的类是通过函数来模拟的。函数的prototype中的方法和属性可以看作是类的实例方法和属性。函数的的方法和属性可以看作是类的静态(类)方法或属性。对于函数的继承,当然也就是类的继承。

函数的继承和对象的继承差别其实也不是很大。对象的继承是复制到对象的内部,而函数的继承则是把数据复制到函数的原型中。Ext.override方法就是完成这项工作。它只是简单的复制,没有理会继承者与被继承者之间的关系。还有一些问题是值得考虑的,如果没有给定继承者,是不是要构建一个继承者,让其继承被继承者的所有功能呢?继承者是不是也应该有继承的能力呢(为其提供继承的方法)?Ext.extend解决了这样问题,该函数是Ext类库的基石。

Ext.extend函数分析

Ext.extend函数仅仅当作extend的功能来看待是有点以偏概全的,我们完全可以把看作能继承的构建器。它的功能有点像prototype1.6中类的构建器(Class.create)。在Ext中,我们可以把Ext.extend看作是组件的构建器。如果没有指定子类,它会在继承的同时生成子类并返回。Ext组件树的应用就是完全建立在extend函数的基础之上。而Ext.extend又可以在继承的过程中构建一个新组件并返回。当作组件的构建器一点也不过份。

通过Ext.extend来实现的组件,我们可以通过类的继承链来访问其父类的方法或构建函数,如Office.CompanyPanel.superclass.constructor.call(this, this.meta);在通过extend实现的组件,其在类的关系上已经形成了链条的关系。我们可以通过这个关系访问到其父类。

代码清单3.2                                                   Ext.extend的源码

extend : function(){

   //io,oc是采用了闭包函数的特点,减少了函数的变量的定义,只有内部能访问。

     var io = function(o){ for(var m in o){this[m] = o[m];} };

     var oc = Object.prototype.constructor;

     //sb,sp是函数类型(即类),overrides是对象类型    

    return function(sb, sp, overrides){                                

      //说明只传入了两个参数。省去sb,sb函数是通过本函数新生成的

        if(typeof sp == 'object'){                                  

           overrides = sp;

           sp = sb;

      //如果overrides中含有constructor方法时,它就是sb子类的构造函数。

      //否则就新建一个构造函数,传入参数调用其父类的构造函数。                 

         sb = overrides.constructor != oc ?

overrides.constructor : function(){sp.apply(this, arguments);};

         }

        var F = function(){}, sbp, spp = sp.prototype;

         F.prototype = spp;               

        //采用new F()新建一个含有所有sp.prototype中的功能的对象。

        //这里做是为了改变sb.prototype中不会改为sp.prototype

         sbp = sb.prototype = new F();                           

         //标识sb的实例对象中的constructorsb函数。

          sbp.constructor=sb;               

          //通过这里的实现,我们就可以类方法的形式去调用其superclass中的方法。

           sb.superclass=spp;                                                  

          //改变父类实例对象中的constructor标识,使其指向自身的构建函数

           if(spp.constructor == oc){ spp.constructor=sp; }  

            //sb注册一个类方法override.

            sb.override = function(o){Ext.override(sb, o); };

             //sb实例对象中override方法

             sbp.override = io;                                                         

             //overrides中的方法拷到sbprototype中,使实例拥有该方法

             Ext.override(sb, overrides);                        

             //为子类加上一个类方法:extend

              sb.extend = function(o){Ext.extend(sb, o);};    

              return sb;

            };

        }()                                                           

 

在上面代码中⑩,我们可以发现这个函数是立即运行的函数。也就是说Ext.extend实际上是②处的函数。那么它为什么要这样做呢?完全可以把①处的两个变量放在②处的函数内部。

因为①处相对每个继承的应用,它们都是不变的。放在函数内部的话,那次每次extend,都要生成这两个变量,用完之后销毁,影响性能。也可以把它们放在Ext的命名变量中,这样做的不好之处在于外部可以引用这两个变量,而我们想这两个变量只能在Ext.extend的内部函数中引用。这里的用法就是采用了函数的闭包特性。提高了效率,又保证其变量的私有性。

上面代码的③是对省略了子类参数的处理。在这种情况下,Ext.extend就要构建子类。如果在构建的对象参数指定了构建这个子类的函数就采用这个函数做为子类的构建器。如果没有的函数,就采用默认的处理,它的默认的处理是把参数传入其父类的构建函数中并运行它。

④处是实现子类原型继承父类原型中的数据。⑤实现了类链的形式。④处第二句和⑥处是指定子类和父类原型的constructor方法,让其指自身的构建函数。⑥处第二句及⑦和⑨处分别为子类或其原型增加overrideextend的函数功能。⑧处就是把overrides中的函数或属性全都复制到子类的原型中。

使用Ext.extend是很简单的,对于不需要在构建方法中直接处理一些功能话,我们完全可能通过如下的方法来生成一个即有方法又有属性的继承的类:

var myclass=Ext.extend(spclass,{/ 一些增加方法和属性});// constructor

Ext的组件中,子类的构建方法中实现的功能一般都在Compoent类中的模板方法initComponent中实现。也就是说一般都是采用上面方面来生成继承的子类。

对于采用子类的自实现的构建方法,相对来说是有点麻烦,如下:

var myclass=function(config){

.. .. ..

myclass.superclass.constructor.call(this, this.meta);//这里是把参数传到父类中构建方法中

… …

}

Ext.extend(myclass,supclass,{//一些增加的方法或属性});

    有的时候,还是要可能要采用这种方法来进行继承的,特别是那些不是组件的继承方式,又要构建方法中自定义实现自有的功能。Ext.extend这两种应用,我们在办公系统的扩展组件都会用到。在第二章的leftMenu组件中,我们就是通过它第二种应用的方法来实现其组件继承于Panel组件。

 

javaEye的blog发布实在是很垃圾。从word贴的话,经常出这样那样的错误!!!!不改进的话,也许很多人会选择其它的blog。

分享到:
评论
5 楼 fins 2009-01-09  
ext 3.0 里这个问题依然存在 唉
4 楼 jljlpch 2009-01-09  
fins 写道
ext的extend有个大bug

会让子类的prototype丢失


算不上bug吧。
不过也是不爽,应该合并起来。
3 楼 fins 2009-01-09  
ext的extend有个大bug

会让子类的prototype丢失
2 楼 jljlpch 2009-01-08  
刚刚看了相似的文章,发现也有人分析了Ext.extend。
发现那文章也讲得很深入。
不过着重点不同,下一篇中解决了其中讲到的问题。
1 楼 jizhan 2009-01-08  
好文章,学习了。

相关推荐

    深入剖析ExtJS 2.2实现及应用连载(全集) DOC精排版!

    《深入剖析ExtJS 2.2实现及应用》是一本专为ExtJS开发者精心打造的指南,旨在揭示ExtJS 2.2的核心实现原理和应用技巧。这本书针对那些希望深入理解ExtJS,而不只是停留在应用层面的开发者。作者通过详尽的源码分析和...

    深入剖析ExtJS_2.2实现及应用

    《深入剖析ExtJS_2.2实现及应用》是一本专为高级Web开发者设计的书籍,专注于探讨ExtJS 2.2版本的源码结构、实现机制和最佳实践。这本书旨在帮助开发者超越仅仅依赖官方文档的阶段,深入理解ExtJS的内在工作原理,...

    ExtJS+2.2实现及应用连载.rar

    本资料“ExtJS+2.2实现及应用连载”旨在深入探讨这一版本的特性和实际应用。 一、ExtJS 2.2的核心特性 1. 组件化开发:ExtJS 2.2提供了大量预定义的UI组件,如表格、表单、树形视图、菜单、工具栏等,开发者可以像...

    EXTJS 2.2 离线帮助文件CHM格式

    通过深入学习这些文档,开发者可以有效地利用EXTJS的强大功能来创建复杂的Web应用,同时提高开发效率和代码质量。 总之,EXTJS 2.2的离线CHM帮助文件为开发者提供了一个全面且方便的参考资料,无论是初学者还是经验...

    [上传下载]ExtJS 2.2 开源网络硬盘系统_dogdisk.zip

    ExtJS 2.2 是一个历史悠久的JavaScript框架,主要用于构建富客户端Web应用程序。这个开源网络硬盘系统_dogdisk.zip很可能是基于ExtJS 2.2版本开发的一个文件存储和管理应用,它允许用户通过Web界面进行文件的上传、...

    ExtJS 2.2 API文档

    2.2版本已经支持国际化,开发者可以通过设置语言包实现应用的多语言显示。 `Ext2.2docs.chm`文件作为API文档,包含了上述所有功能的详细说明,包括类的定义、方法、属性和事件,是开发ExtJS 2.2应用的重要参考资料...

    extjs2.2开发实战项目 已经发布运行

    在这个项目中,我们深入探讨EXTJS2.2的各种控件及其在实际开发中的应用,同时结合Java和JavaScript技术,实现了一个完整的公司级项目。以下是对该项目的详细解析: 1. **EXTJS2.2核心概念**:EXTJS2.2提供了丰富的...

    extjs 2.2

    ExtJS 2.2是Sencha公司开发的一个用于构建富客户端Web应用的JavaScript库,它在Web应用程序的用户界面设计和交互性方面提供了强大的功能。这个版本发布于2008年,是ExtJS框架发展过程中的一个重要里程碑,为开发者...

    extjs 2.2(oozie需要的)

    ExtJS 2.2 是一个基于 JavaScript 的前端框架,用于构建富互联网应用程序(RIA)。它提供了丰富的组件库,包括表格、表单、树形视图、图表和其他多种UI元素,支持拖放、数据绑定和自动布局等功能。在给定的上下文中...

    上传下载ExtJS 2.2 开源网络硬盘系统-dogdisk

    1. **ExtJS框架**:ExtJS是由Sencha公司开发的一个强大的JavaScript库,用于构建富互联网应用程序(RIA)。ExtJS 2.2版本虽然较旧,但仍然包含了许多组件,如表格、面板、窗口、菜单等,以及强大的布局管理和数据...

    extjs2.2支持包

    以前一直没找到extjs2.2的全包,这次在添加Myeclipse的插件时,我找了好久才找到。现在分享下,以免兄弟姐妹们到处去找:

    EXT 中文手册 搭配ExtJs2.2实例更快将ExtJs入手

    EXT中文手册是针对JavaScript库ExtJs的一份详细指南,旨在帮助开发者更快速地掌握和运用ExtJs 2.2...通过深入学习和实践手册中的内容,你将能够熟练掌握ExtJs 2.2,进而构建出功能强大、用户体验优秀的Web应用程序。

    ExtJS 2.2 开源网络硬盘系统-dogdisk.zip

    ExtJS 2.2 是一个历史悠久的JavaScript框架,主要用于构建富客户端Web应用程序。这个开源网络硬盘系统,称为“dogdisk”,是基于此版本的ExtJS构建的,它提供了一个在线存储和管理文件的平台,类似于云盘服务。下面...

    Extjs 2.2 Extjs 3.21 js

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端Web应用程序。...通过学习和使用这两个版本,可以深入理解ExtJS的设计理念,提高JavaScript编程技能,并能更好地应对各种Web应用开发挑战。

    ExtJs 2.2 简明教程 01 入门

    **ExtJs 2.2 简明教程 01 入门** 在本文中,我们将探讨Ext Js 2.2版本的基础知识,这是一款强大的JavaScript框架,用于构建富客户端Web应用程序。首先,让我们深入了解Ext Js的核心内容及其提供的功能。 **1. ...

    extjs 2.2中文开发文档

    Extjs 2.2 中文开发文档 , 很少有错误。 我现在做开发,用的就是2.2版本的。

    extjs2.2 框架下载

    1. **组件化开发**:EXTJS 2.2引入了一种基于组件的开发模式,允许开发者将复杂的用户界面拆分为可复用的小单元,如表格、表单、面板、菜单等。这种模式使得代码更易于维护和扩展,同时提高了开发效率。 2. **丰富...

Global site tag (gtag.js) - Google Analytics