简化的 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的整个架构!
ExtJS6 viewModel继承 viewModel各级控件继承演示,动态改变viewModel 详见文章解释 https://blog.csdn.net/ZYD45/article/details/87867454
Extjs 组件继承结构图,亲手整理,可用于Extjs学习时快速理清组件之间的关系
在"无废话ExtJS系列教程十八[继承:Extend]"中,我们主要关注的是ExtJS中的类继承机制,这是一个核心特性,它允许开发者创建可复用和可扩展的组件结构。在JavaScript中,继承是通过原型链实现的,而在ExtJS中,它被...
这篇博客文章“ExtJs 类的设计”可能深入探讨了如何在ExtJs中有效地设计和使用类。 1. **类的定义** 在ExtJs中,类通过`Ext.extend()`函数创建。这个函数用于创建子类,并继承父类的属性和方法。例如,你可以定义...
在EXTJS中,类继承是其核心特性之一,它允许开发者创建复杂的组件和应用架构,通过继承来重用代码并扩展功能。 在EXTJS中,类系统基于MVC(Model-View-Controller)设计模式,提供了丰富的组件和布局管理。类继承...
ExtJS3 升级到 ExtJS4 需要修改大量代码,主要是因为 ExtJS4 配备了一类新的系统,不向后兼容。在 ExtJS 3 里生成表的几个框架组件,ExtJS4 大多生成 div,这使得 CSS classes 将会失败。ExtJS4 已完全重新写 grid ...
- **类的定义**: Extjs中的类继承于JavaScript原生类,通过Ext.extend来定义。这是Extjs实现面向对象编程的基础。 - **命名空间**: 命名空间在Extjs中用于组织和管理代码,避免变量和函数名的冲突。 #### 3. Extjs ...
ExtJS的`Ext.draw.Container`类可以用来创建这样一个画布,支持拖放操作,允许用户放置和调整工作流元素的位置。 3. **连接线**:工作流元素之间通常需要通过连接线表示流程流转。ExtJS提供了绘图API,可以用来绘制...
在“Extjs源码之--Ext事件机制/继承关系”中,我们将深入探讨EXTJS如何处理事件以及其类层次结构。EXTJS的事件处理主要由EventManager.js这个文件负责,它是EXTJS事件系统的基础。 首先,EXTJS的事件机制基于观察者...
标题中的“类extjs的c++界面库”指的是一个C++开发的用户界面库,它借鉴了ExtJS的设计理念和架构。ExtJS是一款基于JavaScript的前端框架,以其丰富的组件库和强大的布局管理闻名,用于构建复杂的Web应用程序。而这个...
在"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 4允许开发者自定义图标,可以通过编写CSS来设置新的背景图片,或者使用Icon类并传入自定义的SVG代码或数据URL。 6. **响应式设计**: - 在移动设备上,图标可能需要调整大小或样式以适应不同的屏幕尺寸。...
ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端Web应用程序。这个压缩包包含了ExtJS的两个重要版本:2.2和3.2.1。这两个版本在Web开发领域都有着广泛的运用,它们各自拥有不同的特性和改进,对于理解...
- **JS类系统**:ExtJS使用面向对象的类系统,类与类之间可以通过继承实现代码重用和扩展。 - **事件系统**:事件驱动是ExtJS的核心机制,允许组件间通信和响应用户操作。 - **Ajax通信**:Ext.Ajax模块负责异步...
ExtJS 是一个流行的JavaScript框架,用于构建富客户端的Web应用程序。它提供了丰富的用户界面组件、数据绑定机制和强大的API,使开发者能够创建功能强大的、响应式的桌面和移动应用。7.6版本是ExtJS的一个重要更新,...