二: 数组作用域问题: 今天遇到一个折腾了很久才解决的问题.
先上结论: 在使用extends时, 不能将数组和属性对象在proptype中(就是 : , 的形式)声明.
使用Ext.extend 扩展了1个FormPanel, 然后new了2个对象, 却发现对一个对象进行push等操作时, 始终对另一个对象有影响.
最后发现, 是在js的'类'中声明的数组, 其实例对象的此数组使用的同一数组.
DataGrid = Ext.extend(Ext.grid.GridPanel, {
fields = new Array();
//省略其他...
}
var d1 = new DataGrid ();
var d2 = new DataGrid ();
d1.fields.push('a');
alert(d2.fields[0]); //将提示 a.
解决办法 : 在函数内以 this的形式定义.
DataGrid = Ext.extend(Ext.grid.GridPanel, {
initComponent : function(config) {
this.fields = new Array();
//省略其他...
}
}
Ext是比较形象的OO继承, 实际上不用Ext的继承也会遇到这个现象.
DataGrid = function(){
this.f = new Array(); //安全
}
DataGrid.proptype = {
fields = new Array(); // 这里, 继承DataGrid的对象, 就会和上面一样出现数组问题.
}
究其原因, 可能数组在js中属于引用类型, js是基于function的,就像java是基于object. 因此在组件内定义数组和定义function一样, 是作为单例存在的.