日期:2014-05-16  浏览次数:20353 次

[原创]Javascript 对像中涉及异步操作时的对象覆盖问题

?

问题:自身以外的对象、异步请求相关、定时器等,要调用对象本身的相关方法时,后新建对象中涉及异步操对自身的引用将覆盖前面新建对象中的相应数据。如下:当 var A = new BBMSC(); var B = new BBMSC();B中异步操作中的相关对自身的引用ME将覆盖A中先定义的ME,导致A对象相关操作失败。此时,把BBMSC类代码重新拷贝一份为BBMSC2,var B = new BBMSC2();也是同样的问题。当把BBMSC2中相关异步操作的ME改成MY时,问题解决。

解决:在新建对象时,异步操作时的对象引用名手动赋值。用万能的eval动态改变对象的引用名。暂时先这样,还有其它办法么?

?

BBMSC.prototype.bldload = function(){

ME = this;

var instanceName = ME.InstanceName;

eval(instanceName + " = this;");

$(citems).change(function(){

//ME.bld($(this).attr('id'), $(this).attr('toid'), ?'');

//ME.chkbld($(this).attr('id'), $(this).attr('toid'));

eval(instanceName + ".bld($(this).attr('id'), $(this).attr('toid'), ?'');");

eval(instanceName + ".chkbld($(this).attr('id'), $(this).attr('toid'));");

});

ME.bld(defaultfield,defaultfield,'');

ME.chkbld(defaultfield,defaultfield);

}

?

?

?

if(typeof(ME.COMDATA[tmptofield]) == 'object'){

? ?ME.bldlist(this.COMDATA[tmptofield], tofield);

//eval(instanceName + ".bldlist(" +instanceName + ".COMDATA['"+tmptofield+"'],"+ tofield+");");

}else{

$.getJSON("/?m=arsys&c=ajax",ME.BLDPARR,function(data){

//ME.bldlist(data, tofield);

eval(instanceName + ".bldlist(data, tofield);");