Prototype.AjaxRequest的调用堆栈重写问题
来源:互联网 发布:编程语言种类及介绍 编辑:程序博客网 时间:2024/09/21 09:22
由于调用AjaxRequest类进行XMLHTTPRequest操作时,this引用(指向当前function所在的对象)会出现了call stack问题,从而指向当前的对象:
错误演示:
var OverWritingDemonstrate=Class.create();
OverWritingDemonstrate.prototype={
xml_source:'',
initialize:function(){
},
putRequest:function(url,params,callBackFunction){
var funcHolder=arguments.callee.$;
var xmlHttp = new Ajax.Request(url,
{
method: 'get',
parameters: params,
requestHeaders:['my-header-encoding','utf-8'],
onFailure: function(){
alert('对不起,网络通讯失败,请重新刷新!');
},
onSuccess: function(transport){
},
onComplete: function(transport){
this.xml_source=transport.responseText;
this.showXMLResponse();
}
});
},
//显示xml信息
showXMLResponse:function(){
alert(this.xml_source);
},
…
}
这样使用必定找不到showXMLResponse方法,因为在AjaxRequest的onComplete函数中的this指向了当前的function所在的对象xmlHttp,而不是我们的OverWritingDemonstrate类对象。
Fix方法:
我们可以借鉴一下《解开JavaScript生命的达芬奇密码》中Joshua Gertzen的方法,实现一个ClassUtils类:
//类工具
var ClassUtils=Class.create();
ClassUtils.prototype={
_ClassUtilsName:'ClassUtils',
initialize:function(){
},
/**
*给类的每个方法注册一个对类对象的自我引用
*@paramreference对类对象的引用
*/
registerFuncSelfLink:function(reference){
for (var n in reference) {
var item = reference[n];
if (item instanceofFunction)
item.$ = reference;
}
}
}
然后修改一下前面的OverWritingDemonstrate,这里为了达到区分效果的目的,类名取为AjaxWrapper:
//Ajax操作封装类:
//由于调用AjaxRequest类进行XMLHTTPRequest操作时,this引用(指向当前的对象)会出现了callstack问题,从而指向当前的对象。
//所以,对putRequest、callBackHandler、以及callback方法都要使用arguments.callee.$来获得正确的类对象引用
var AjaxWrapper=Class.create();
AjaxWrapper.prototype={
xml_source:'',
/**
*初始化
*@paramisDebug是否显示调试信息
*/
initialize:function(isDebug){
new ClassUtils().registerFuncSelfLink(this);
},
putRequest:function(url,params,callBackFunction){
var funcHolder=arguments.callee.$;
var xmlHttp = new Ajax.Request(url,
{
method: 'get',
parameters: params,
requestHeaders:['my-header-encoding','utf-8'],
onFailure: function(){
alert('对不起,网络通讯失败,请重新刷新!');
},
onSuccess: function(transport){
},
onComplete: function(transport){
funcHolder.xml_source=transport.responseText;
funcHolder.showXMLResponse();
}
});
},
//显示xml信息
showXMLResponse:function(){
alert(funcHolder.xml_source);
},
…
}
这样就避免了发生在调用堆栈中的this重写问题了。
- Prototype.AjaxRequest的调用堆栈重写问题
- Prototype.AjaxRequest的调用堆栈重写问题【摘】
- 堆栈的详解(四):调用约定问题
- 函数的调用堆栈
- 对 PInvoke 函数的调用导致堆栈不对称问题
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题
- java没有打印异常调用堆栈的问题
- 对PInvoke函数的调用导致堆栈不对称问题
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题
- 对PInvoke函数的调用导致堆栈不对称问题
- 解决:对 PInvoke 函数的调用导致堆栈不对称问题
- 对 PInvoke 函数的调用导致堆栈不对称问题
- 基类虚函数重写调用问题
- Java的重写与调用父类方法问题
- Java的重写与调用父类方法问题
- prototype优先级的问题
- 十年编程经验凝结 与新人们分享
- VSS 2005 配置简明手册
- Servlet/JSP服务器端的重定向
- 解开JavaScript生命的达芬奇密码
- 口误
- Prototype.AjaxRequest的调用堆栈重写问题
- 梦幻文件分割器 V1.0
- 市面上常见的存储介质分析
- 设置鼠标的形状
- C#的多线程机制
- javascript 获取 地址栏 参数
- 女鬼
- 原创:关于一些Java开发工具的使用心得(不断更新)
- 好用不贵 8款节后热门低价笔记本推荐