这两天遇到个问题,两个对象会共用一份数据,
如下:
Ext.extend(Nts.Window.RaaInterfaceDetailWindow,Ext.Window,
{
interfaceMap : {}
})
这里定义了一个对象,继承自window,它有一个属性interfaceMap且直接给了初始值
以前看过extjs 的继承,可仅仅只是关注了它的原理,没有去想它的属性是怎么给的,今天一看它对属性的给值吓我一跳
Ext.override(sb, overrides),sb相当于Nts.Window.RaaInterfaceDetailWindow,overrides相当于{
interfaceMap : {}
},
也就是说overrides会添加到Nts.Window.RaaInterfaceDetailWindow的prototype中去,这会倒致这里的
interfaceMap : {}相当于全局属性了.
所以上面的定义方式的问题就大了,需要改成这样:
Ext.extend(Nts.Window.RaaInterfaceDetailWindow,Ext.Window,
{
interfaceMap : null,
initComponent : function()
{
this.interfaceMap = {};
}
})
这样new出来的对象才不会产生共用属性的问题,千万不要将要释放的资源在属性中初始化
上面的说法有是错的,资源无法释放是由于使用产生的,不是定义产生的:
Ext.extend(Nts.Window.RaaInterfaceDetailWindow,Ext.Window, { interfaceMap : {}, })在prototype中有个属性叫interfaceMap,它的值为{} 与 Ext.extend(Nts.Window.RaaInterfaceDetailWindow,Ext.Window, { interfaceMap : null, initComponent : function() { this.interfaceMap = {}; } })prototype中有interfaceMap=null,new对象时,对象本身的interfaceMap={}会覆盖prototype中的interfaceMap this.interfaceMap = {};相当于新的对象的interfaceMap 属性覆盖了prototype中的属性,这样每个对象中的interfaceMap 都是不同的 那么是什么原因倒致prototype中的interfaceMap有值了呢? 如果没有使用this.interfaceMap={}给值,而是直接this.interfaceMap['a']='a'会怎么样?这个时候对象本身是没有interfaceMap属性的,它会跑到prototype中找到interfaceMap,并给它的属性给值,这样所有对象都会使用这个全局的interfaceMap