Ext继承问题:数组共享导致意外行为剖析

需积分: 10 1 下载量 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时,特别是在处理可变数据结构时,需要格外注意继承机制对对象状态的影响。