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

深入剖析ExtJS 2.2实现及应用连载:Ext.extend函数的扩展

阅读更多
Ext.extend函数的扩展

 

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

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

 

 

在使用Ext.extend的过程中,很多人会对很长很长的类链形式的父类中的方法的访问感觉不满。因为在Java中,我们可能通过this.supper来访问其父类的同名方法的。我们能不能有一个好的方法来解决这个问题,同时又保证Ext.extend兼容以前的类链形式的访问。

在代码3.2清单中⑤处,通过sb.superclass=spp为其静态的类注册superclass属性用来访问其父类,那么在其后加上sbp.superclass=spp;为其实例注册superclass属性能不能达上我们的要求呢?

表面上是可以的。但是细一想,如何是祖先,父亲,孩子三重继承的话,父亲通过调用this.superclass时,其得到不是祖先,而是自身。因为this是指向孩子。那怎么办呢?有没有在继承的时候就保存其对其自身的父类的引用呢?

也就是说在调用this.superclass的时候,它的superclass要改变其引用,这个改变是根据其所自身所在类而作判断的。但是superclass只是属性,调用时肯定是改不了的,如果我把this.supercalss的调用转换成this.supercalss(),那么在调用时就是运行supercalss(),这个方法在运行时找到其正确的父类。

那么现在的任务是如何实现这个supercalss()函数?要找到这个子类的父类的话,那么在继承的时候,就先在这个子类的什么地方来保存其父类的引用。什么地方呢?因为this的方式是对象方式的访问,而不是类方式的访问,保存在类中有点麻烦。

既然supercalss()是对象方式的访问,可以不可以保存在supercalss()的静态属性中呢?能这样的话,supercalss()的内部实现只要根据不同的子类而引用到这个静态属性就可以了。这里还有一个问题就是可以保证多重关系的孩子的同名静态属性不覆盖其父亲的同名静态属性?这就得采用闭包引用的原理了。

我们可以先把代码清单3.2中的return语句之前加上sbp.superclass=superclass(spp);这样每个子类的原型中都有一个自已superclass的方法(返回的是函数)。这个方法是要传入其父类的原型做为参数并将其保存在返回的函数的静态属性中。

接下来要做是根据调用这个函数的的不同类来判断啦,这个可以通过arguments.callee来引用其函数对象本身,尽管是同名的superclass,但是对于不同的层次的子类,其函数实质是完全不同的函数对象。其superclass实现如下:

代码清单3.3                                                   superclass的实现

var superclass=function(sp){

      var s=function(){ return arguments.callee.superclass; }

       s.superclass=sp;

       return s;};

上面的代码可以看出每次不同层次的子类,都是返回不同的s函数,它的函数体内容是一样的。但是其superclass是不同的。函数体中的arguments.callee就是根据this.superclass()调用来判断其是指向那个s函数。(实质上是没有判断的,因为this.superclass()就是找到当前对象的s的引用)。这一段代码放在Ext.extend()函数起始位置就可以了。

我们来看一下其测试的例子:

代码清单3.4                                                 Ext.extend扩展测试

var Animal = function() {

     alert("this is Animal constructor");

    this.name = 'animal';

    this.age = 7;

};

Animal.prototype.getAge = function() {

     alert(this.name+"'age is "+this.age);

};

Animal.prototype.getName = function() {

     alert("this is the animal Name!");

};

var Cat = Ext.extend(Animal, {

    name : 'cat',

    age : 5,

    constructor : function() {

        alert("this is Cat constructor");

       this.superclass().constructor(arguments);

    },

    getAge : function() {

       alert(this.name + "'age is " + this.age);

       this.superclass().getAge();    

    }

});

var homeCat = function() {

     alert("this is homeCat constructor");

    this.superclass().constructor(arguments);

};

Ext.extend(homeCat, Cat, {

    name : 'homeCat',

    age : 3,

    getAge : function() {      

       this.superclass().getAge();    

    }

});

var myCat = new homeCat();

myCat.getAge();

这是建立在上面扩展之后的例子,通过new homeCat(),它会依次弹出homeCat,Cat,Animal构建函数的alert的内容。调用myCat.getAge(),它也会依次弹出homeCat,Cat,Animal各自的getAgealert的内容。尽管都是通过this.superclass来调用,却还是保证其继承的关系。

这样的继承和Ext的继承是有点区别的,Ext组件树的继承都是采用如this.superclass().getXX.apply(this,arguments)的方式,每个继承链的联接都是通过apply来改变其作用域,把其所有父类中的实现方法中的this都指向当前运行的实例。

这也就是所有继承父类的this都是针对当前运行的实例进行操作,通过这样的实现,能在父类中调用子类的函数,也就是模板方法的应用。而上面扩展的继承方式则有点不同,它的this只能是指向当前类中的方法或属性。如果当前类没有的话,就会从其父类或祖先类去查找。子类对于父类中属性或方法进行了修改,这个并不会影响父类其它方法对这个属性或方法进行的调用或操作。也就是this指向是纯粹的该方法所在类的类对象。

 

分享到:
评论
3 楼 dinguaa 2009-06-08  
我修改了猫的继承实例如下:为何无法运行呢?使用extjs2.2.1
// JavaScript Document
var Animal = function() {
   alert("this is Animal constructor");
   this.name = 'animal';
   this.age = 7;
};

Animal.prototype.getAge = function() {
   alert(this.name + "'age is "+this.age);
};

Animal.prototype.getName = function() {
   alert("this is the animal Name!");
};

var Cat = Ext.extend(Animal, {
   name : 'cat',
   age : 5,
   constructor : function() {
      alert("this is Cat constructor");
      this.superclass().constructor(arguments);
   },
   getAge : function() {
      alert(this.name + "'age is " + this.age);
      this.superclass().getAge();
   }
});

var homeCat =Ext.extend(homeCat,Cat,{
   name : 'homeCat',
   age : 3,
   constructor : function() {
      alert("this is home cat constructor");
      this.superclass().constructor(arguments);
   },
   getAge : function() {
      alert(this.name + "'age is " + this.age);
      this.superclass().getAge();
   }
});

var myCat = new homeCat();
myCat.getAge();
2 楼 dinguaa 2009-06-05  
想知道代码3.2清单在哪里?感觉楼主的文章看起来不完整。
1 楼 jljlpch 2009-01-08  
<pre name='code' class='js'>extend : function() {
// inline overrides
var io = function(o) {
for (var m in o) {
this[m] = o[m];
}
};
var oc = Object.prototype.constructor;
var superclass = function(sp) {

var s = function() {
var name = (s.caller || {}).name;
var len = arguments.length, t = this;
var supper = arguments.callee.superclass;
if (!name)
for (var n in t) {
if (t[n] == s.caller) {
name = n;
break;
}
}

if (len &gt; 0 &amp;&amp; name) {
alert(name);
var callArgs = Array.prototype.slice.call(
arguments, 0);
Array.prototype.splice.apply(callArgs, [0, 1]);
return supper[name](callArgs);
}
return supper;
}
s.superclass = sp;
return s;
};

return function(sb, sp, overrides) {
if (typeof sp == 'object') {
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.override = io;
Ext.override(sb, overrides);
sb.extend = function(o) {
Ext.extend(sb, o);
};
sbp.superclass = superclass(spp);
return sb;
};
}(),
//已经溶入ExtJS使用,还没有发现问题。





</pre>
<p> </p>

相关推荐

    Ext Js权威指南(.zip.001

    2.2 配置使用ext js库 / 35 2.3 编写“hello world”程序 / 37 2.4 关于ext.onready / 38 2.5 关于ext.blank_image_url / 40 2.6 关于字体 / 42 2.7 ext js 4语法 / 42 2.8 本地化 / 60 2.9 为本书示例准备...

    无废话ExtJs 系列教程十八[继承:Extend]

    继承在ExtJS中的实现主要基于`Ext.extend()`方法,这个方法是ExtJS提供的一个静态方法,它允许一个类(子类)继承另一个类(父类)的所有属性和方法。通过`Ext.extend()`,我们可以定义新的类,同时保留和扩展已存在...

    Extjs Grid 扩展实例

    "Extjs Grid 扩展实例"是一个演示如何增强Grid功能的实践案例,通过这个实例,我们可以学习到如何在原有Grid的基础上进行自定义扩展,实现更复杂的数据管理和用户交互。 首先,"extend"在编程中通常意味着类的继承...

    EXtJS学习 EXtJS学习

    EXTJS 学习:深入理解 `Ext.extend` 及其在继承中的陷阱 EXTJS 是一个强大的 JavaScript 框架,用于构建富客户端应用程序。它提供了丰富的组件库和强大的数据绑定机制。在 EXTJS 中,`Ext.extend` 是核心的继承机制...

    extJs3升级extjs4方案

    ExtJS3 升级到 ExtJS4 方案 ...可以看到,ExtJS4 使用 Ext.create 函数来创建组件类,这样可以更加方便地创建组件。 ExtJS3 升级到 ExtJS4 需要修改大量代码,需要我们重新学习和适应 ExtJS4 的新特性和变化。

    ExtJs中处理后台传过来的date对象显示到页面上

    在ExtJs中处理后台传递的Date对象并将其正确地显示在页面上,通常涉及到数据模型(Model)、存储(Store)、列模型(ColumnModel)以及渲染器(Renderer)的配置。以下是一个详细的步骤说明: 1. **创建数据模型...

    ExtJS4.1实现的mvc模式经典入门案例

    ExtJS是一个基于JavaScript的富客户端应用框架,专用于构建企业级的Web应用程序。在ExtJS 4.1中,引入了强大的MVC(Model-View-Controller)模式,这是一种设计模式,有助于组织和分离应用程序的不同部分,使得代码...

    ExtJs.doc 扩展介绍 英文

    如果你想要扩展 `Ext.Component` 或其子类,你可以使用 `Ext.extend()`,但在 Ext2.x 及之后的版本,你通常不需要定义自己的构造函数,而是重写 `initComponent()` 方法来初始化你的组件。 创建预配置类是扩展组件...

    ext面向对象和继承

    EXTJS中的继承是通过`Ext.extend()`或`Ext.createByAlias()`实现的。继承允许子类重写或扩展父类的方法和属性。例如,我们可以创建一个新的按钮类,继承自EXTJS的`Ext.button.Button`: ```javascript MyButton = ...

    ExtJS的extend(Ext Designer的使用)

    ExtJS的`extend`特性是其核心的面向对象机制之一,它允许我们在JavaScript中创建类的继承链。在Ext Designer的环境下,这个概念尤为重要,因为设计师工具提供了可视化的界面来帮助开发者更直观地构建和扩展组件。这...

    extjs3.4如何创建对象

    EXTJS中的所有对象都是由`Ext.extend()`函数或`Ext.apply()`函数来创建的。例如,如果你要创建一个简单的Panel对象,可以这样做: ```javascript var myPanel = Ext.extend(Ext.Panel, { title: '我的面板', ...

    Extjs中文教程2.x

    - **示例**: 使用 `Ext.Fx` 和 `Ext.Element` 类中的动画函数实现动态效果。 #### 五、元素操作与模板 **5.1 元素操作** - **工具**: `Ext.DomHelper` 类提供了创建、操作 DOM 元素的方法。 - **示例**: `Ext....

    Extjs4.2 根据不同的数值设置tabpanel行的背景颜色

    ### Extjs4.2 根据不同的数值设置 TabPanel 行的背景颜色 #### 一、引言 在Web应用程序开发中,...这种方法不仅适用于数值类型的数据,还可以扩展到其他类型的字段,如状态、等级等,以适应更多应用场景的需求。 ##

    精通JS脚本之ExtJS框架.part2.rar

    14.1 利用Ext.extend实现继承 14.2 与ExtJS扩展相关的预备知识 14.2.1 定义命名空间 14.2.2 使用xtype 14.3 用户扩展和插件 14.3.1 编写自定义用户扩展 14.3.2 常用插件UploadDialog 14.3.3 常用插件...

    Ext继承和扩展

    "Ext继承和扩展"是ExtJS中的核心概念,它们是实现代码复用和模块化设计的关键。在这个主题中,我们将深入探讨这两个概念以及它们在实际开发中的应用。 **一、Ext继承** 在面向对象编程中,继承是类之间的一种关系...

    精通JS脚本之ExtJS框架.part1.rar

    14.1 利用Ext.extend实现继承 14.2 与ExtJS扩展相关的预备知识 14.2.1 定义命名空间 14.2.2 使用xtype 14.3 用户扩展和插件 14.3.1 编写自定义用户扩展 14.3.2 常用插件UploadDialog 14.3.3 常用插件...

    Extjs4之MVC应用架构

    ### Extjs4之MVC应用架构详解 #### 一、MVC模式介绍 MVC(Model-View-Controller)模式是一种软件设计模式,用于将应用程序的业务逻辑、数据表示和用户交互分离,使得应用程序更加模块化,易于维护和扩展。在ExtJS...

Global site tag (gtag.js) - Google Analytics