Ext继承问题:数组共享导致意外行为剖析
需积分: 10 54 浏览量
更新于2024-07-30
收藏 4.2MB DOC 举报
在深入学习Ext.js的过程中,遇到一个关于Ext.extend方法进行继承时的有趣现象。Ext.extend是Ext库中用于创建新类并继承父类的关键工具,它允许我们在JavaScript中实现面向对象的继承。在这个例子中,开发者定义了一个基类BaseClass,包含一个数组成员arr和一个空函数init。
首先,BaseClass通过Ext.extend继承了Ext.util.Observable,这样它的实例将具有Observable的一些内置功能。然后,两个子类SubClass1和SubClass2分别继承自BaseClass,并覆盖了init方法,目的是在初始化时向数组arr中添加不同的元素。
在extTest函数中,创建了SubClass1和SubClass2的实例并调用各自的init方法。理论上,由于每个子类都有自己的数组副本,alert(c1.arr)和alert(c2.arr)应分别显示1和2。然而,实际运行中,这两个alert都显示了1和1,2,这是因为Ext.extend在处理数组时的行为并不是我们预期的浅复制。
问题出在Ext.extend背后的细节上,特别是Ext.override函数。当对BaseClass进行扩展时,Ext.override导致子类共享了同一个数组引用,而不是每个子类都拥有独立的数组副本。这意味着,无论哪个子类的init方法改变arr,所有子类实例都将受到影响。
为了解决这个问题,我们需要在BaseClass的定义中明确指定arr为null,然后在init方法中重新初始化数组,确保每个子类都有独立的数组。修正后的代码如下:
```javascript
var BaseClass = Ext.extend(Ext.util.Observable, {
arr: null,
init: function() {
this.arr = []; // 将arr初始化为一个新的数组,确保每个子类有自己的副本
}
});
```
这样,每次调用init方法时,都会创建一个新的数组,从而避免数组共享带来的意外行为。通过这样的修改,当执行extTest函数时,每个alert将显示正确的值,且不会因为继承关系导致数据混乱。这个经验教训提醒我们在使用Ext.extend时,特别是在处理可变数据结构时,需要格外注意继承机制对对象状态的影响。
2011-04-22 上传
2008-11-26 上传
2016-01-27 上传
2023-06-09 上传
2023-09-18 上传
2023-03-16 上传
2023-03-16 上传
2023-06-14 上传
2023-06-09 上传
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
adrian_bj
- 粉丝: 0
- 资源: 3
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解