`
yiminghe
  • 浏览: 1460337 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

简析 Extjs 类继承

阅读更多

简化的 Ext 原型链的类设计

 

function A() {
    alert('a');
}
function B() {
    B.superclass.constructor.call(this);
}
function temp() {
}
temp.prototype = A.prototype;

//防止A 的实例属性也搞到 B 里去 ,没有意思,我们只需要 A 的 prototype 里的公共属性
//不能使用 B.prototype=A.prototype  这样的话修改 B.prototype 则 A.prototype 也变了,以及影响instanceof
//不建议 B.prototype =new A() ;这样的话 A 的实例方法也到 B.prototype 里去了
B.prototype = new temp();

//上一步后 B 的实例的构造函数属性为 A 了,
// B.prototype.constructor == A
//为了以后方便B的子类调用B的构造函数
//如 C.superclass.constructor.call(this);
//要纠正
//B 的实例 的 构造函数属性要设为 B
B.prototype.constructor = B;

//要记录 B 的父亲,便于以后调用父亲方法
B.superclass = A.prototype;

if (A.prototype.constructor == Object.prototype.constructor) {
    A.prototype.constructor = A;
}

 

简要分析:

 

1.temp 作为一个空函数,将用它创建的一个对象实例插入到原型链中。这样做可以避免创建超类的新实例,因为他可能比较庞大,而且有时超类的构造函数有一些副作用(超类实例的数据属性到子类的原型中),或者会执行一些需要大量计算的任务。

 

2.最后三行代码则用来确保超类的 prototype 的 constructor 属性已经被正确设置(即使超类就是Object类本身),在用到这个新的superclass属性调用超类的构造函数时这个问题很重要。


3.最后一行是为了如果父类的 constructor 被重置了,这时候就要设回来, 我怀疑是不是 extjs 担心 这样定义类  

 

function x() {}
x.prototype = {
    y: function() {}
};
 
这样的话  x.prototype.constructor == Object.prototype.constructor  了 ,继承 x 时需要重置 x.prototype.constructor = x, 这样才能子类 sub 继承 x 时, sub.superclass.constructor == x ,但是正确的定义应该是  

x.prototype.y=function(){} 

 

他是为了预防第一种定义原型方法吧 ,我一直觉得整个设置  

 

x.prototype={}; 

 

是不好的,它把constructor也覆盖了 ,应该是 x.prototype.y=....或者一些工具函数比如 ext的override 等等

 

 

总之上述代码完美实现了一个类原型继承链,并且可以有子类显式调用父类构造函数了。

 

PS: instanceof 问题


instanceof 表面来看是来判断是否对象是某个函数new出来的,但实际上只是在原型链的比较操作:

看个例子:

 

function p(){}
function c(){}
c.prototype=p.prototype;
function d(){}
d.prototype=p.prototype;
var a=new d();
alert(a instanceof c);

 

意外么?所以我们不建议直接

 

function p(){}
function c(){}
c.prototype=p.prototype;

 

ejohn 在一篇文章 中提到的 instanceof 机制模拟 

 

function instanceOf(object, constructor) {
  while (object != null) {
    if (object == constructor.prototype)
      return true;
    object = Object.getPrototypeOf(object);
  }
  return false;
}

function p(){}
function c(){}
c.prototype=p.prototype;
function d(){}
d.prototype=p.prototype;
var a=new d();
alert(instanceOf(a,c))


现在明白了吧。其中 getPrototypeOf 为ecmascript标准中的获得对象内部  _proto_ 属性,指向它的构造函数的 prototype.(IE没有实现哦)。

 

 

ps2 : 实例属性问题

 

function xy(){
}
xy.prototype.z={q:1};
var x=new xy();
alert(x.z.q);
//可以吧这句代码注释掉,看看前后结果
x.z={q:3};
alert(xy.prototype.z.q);
x.z.q=2;
alert(xy.prototype.z.q);

 

简要分析:

 

1.对象读取属性时,(若该属性对象本身没有) 会向类的prototype相应属性查看读取。

2.对象设置属性时,会直接修改自身的属性,和类的prototype相应属性无关。

3.x.z.q=1 读分析 :x.z 读取的是 ,(若z不存在x本身属性), 类的prototype相应属性 ,x.z.q 则设置了原型z属性的 q值。

4.x.z={q:3} 写分析: 若直接设置 x.z 则设置的是 x对象本身的属性 ,和 类的prototype相应属性z无关

 

总之是:由于原型链机制而导致的读和写的不对等性造成的。

分享到:
评论

相关推荐

    extjs组建继承结构图

    extjs组建继承结构图 让你了解extjs的整个架构!

    ExtJS viewModel继承

    ExtJS6 viewModel继承 viewModel各级控件继承演示,动态改变viewModel 详见文章解释 https://blog.csdn.net/ZYD45/article/details/87867454

    Extjs继承结构图.png

    Extjs 组件继承结构图,亲手整理,可用于Extjs学习时快速理清组件之间的关系

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

    在"无废话ExtJS系列教程十八[继承:Extend]"中,我们主要关注的是ExtJS中的类继承机制,这是一个核心特性,它允许开发者创建可复用和可扩展的组件结构。在JavaScript中,继承是通过原型链实现的,而在ExtJS中,它被...

    ExtJs 类的设计

    这篇博客文章“ExtJs 类的设计”可能深入探讨了如何在ExtJs中有效地设计和使用类。 1. **类的定义** 在ExtJs中,类通过`Ext.extend()`函数创建。这个函数用于创建子类,并继承父类的属性和方法。例如,你可以定义...

    EXT dojochina Ext类继承.rar

    在EXTJS中,类继承是其核心特性之一,它允许开发者创建复杂的组件和应用架构,通过继承来重用代码并扩展功能。 在EXTJS中,类系统基于MVC(Model-View-Controller)设计模式,提供了丰富的组件和布局管理。类继承...

    extJs3升级extjs4方案

    ExtJS3 升级到 ExtJS4 需要修改大量代码,主要是因为 ExtJS4 配备了一类新的系统,不向后兼容。在 ExtJS 3 里生成表的几个框架组件,ExtJS4 大多生成 div,这使得 CSS classes 将会失败。ExtJS4 已完全重新写 grid ...

    轻松搞定Extjs 带目录

    - **类的定义**: Extjs中的类继承于JavaScript原生类,通过Ext.extend来定义。这是Extjs实现面向对象编程的基础。 - **命名空间**: 命名空间在Extjs中用于组织和管理代码,避免变量和函数名的冲突。 #### 3. Extjs ...

    extjs流程界面设计器参考_ExtJS工作流设计器_extjs工作流_extjs_

    ExtJS的`Ext.draw.Container`类可以用来创建这样一个画布,支持拖放操作,允许用户放置和调整工作流元素的位置。 3. **连接线**:工作流元素之间通常需要通过连接线表示流程流转。ExtJS提供了绘图API,可以用来绘制...

    Extjs源码之--Ext事件机制/继承关系

    在“Extjs源码之--Ext事件机制/继承关系”中,我们将深入探讨EXTJS如何处理事件以及其类层次结构。EXTJS的事件处理主要由EventManager.js这个文件负责,它是EXTJS事件系统的基础。 首先,EXTJS的事件机制基于观察者...

    类extjs的c++界面库

    标题中的“类extjs的c++界面库”指的是一个C++开发的用户界面库,它借鉴了ExtJS的设计理念和架构。ExtJS是一款基于JavaScript的前端框架,以其丰富的组件库和强大的布局管理闻名,用于构建复杂的Web应用程序。而这个...

    ExtJs3.3中文API.CHM_extjs3.3中文文档_

    在"ExtJs3.3中文API.CHM"中,开发者可以找到关于ExtJS 3.3的所有API和类的详细描述,以及相关的示例代码。 ExtJS 3.3的核心特性包括: 1. **组件化**:ExtJS基于组件模型,提供了一系列预定义的UI组件,如按钮、...

    ExtJS快速入门 ExtJS快速入门 ExtJS快速入门

    ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门 ExtJS快速入门ExtJS快速入门 ExtJS快速入门 ExtJS...

    EXTjs4.0学习文档

    类是 EXTJS 的另一个基本概念,提供功能的非图形可形的类,它们为图形类提供了有力的支持。类可以分为数据支持类、拖放支持类、布局支持类、本地状态存储支持类、实用工具类等。密封类是不能被扩展的类,原型类是...

    包含各种类型的extjs小图标,Extjs4小图标

    - ExtJS 4允许开发者自定义图标,可以通过编写CSS来设置新的背景图片,或者使用Icon类并传入自定义的SVG代码或数据URL。 6. **响应式设计**: - 在移动设备上,图标可能需要调整大小或样式以适应不同的屏幕尺寸。...

    Extjs 2.2 Extjs 3.21 js

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端Web应用程序。这个压缩包包含了ExtJS的两个重要版本:2.2和3.2.1。这两个版本在Web开发领域都有着广泛的运用,它们各自拥有不同的特性和改进,对于理解...

    ExtJS 3.4 源码包

    - **JS类系统**:ExtJS使用面向对象的类系统,类与类之间可以通过继承实现代码重用和扩展。 - **事件系统**:事件驱动是ExtJS的核心机制,允许组件间通信和响应用户操作。 - **Ajax通信**:Ext.Ajax模块负责异步...

    ExtJS 7.6 SDK trial

    ExtJS 是一个流行的JavaScript框架,用于构建富客户端的Web应用程序。它提供了丰富的用户界面组件、数据绑定机制和强大的API,使开发者能够创建功能强大的、响应式的桌面和移动应用。7.6版本是ExtJS的一个重要更新,...

Global site tag (gtag.js) - Google Analytics