我有以下代码。
var handleJson = function(){
var jsonData ='xx';
var eventObject,eventObjectx=[];
that = this;
var convertJsonToObject = function(datax){
//debugger;
try {
that.printList(datax.data);
} catch(e) {
console.log(e);
}
//debugger;
}
return{
getDatafromserver: function(url){
$.ajax({
crossOrigin: true,
url: url,
success:convertJsonToObject
//console.log(jsonData);
});
},
printList:function(eventObject){
$.each(eventObject,function(index,val){
$('#eventlist').append('<li>'+val.event+'</li>');
})
}
}
}
var jsonHandler = new handleJson();
jsonHandler.getDatafromserver(url);
//jsonHandler.printList('eventlist');
});
虽然函数printList
存在返回错误
TypeError:that.printList不是函数{stack:(...),message: &#34; that.printList不是函数&#34;}
任何人都可以帮助我吗?
答案 0 :(得分:1)
this
行中that = this
的值与您在handleJson
函数末尾返回的对象无关。
由于您将new
与handleJson
一起使用,因此您希望添加this
引用的对象,而不是返回一个新的无关对象:
var handleJson = function() {
var jsonData = 'xx';
var eventObject, eventObjectx = [];
var that = this;
var convertJsonToObject = function(datax) {
//debugger;
try {
that.printList(datax.data);
} catch (e) {
console.log(e);
}
//debugger;
}
this.getDatafromserver = function(url) {
$.ajax({
crossOrigin: true,
url: url,
success: convertJsonToObject
//console.log(jsonData);
});
};
this.printList = function(eventObject) {
$.each(eventObject, function(index, val) {
$('#eventlist').append('<li>' + val.event + '</li>');
})
};
};
var jsonHandler = new handleJson();
jsonHandler.getDatafromserver(url);
//jsonHandler.printList('eventlist');
以下是new
的工作原理:
prototype
属性引用的对象支持的新对象;所以在你的情况下,由handleJson.prototype
支持的新对象。handleJson
),this
引用该新对象。null
,则new
将其创建的对象作为其结果;但是如果目标函数返回非null
对象引用,则覆盖该默认值,new
将该对象引用作为结果。在原始代码中,最后一点正在发挥作用。
旁注:您的代码正在成为The Horror of Implicit Globals的牺牲品,因为您没有声明that
。我已经在上面添加了var
。
旁注:JavaScript中压倒性的惯例是构造函数(您通过new
调用的函数)以大写字母开头。它们通常也是名词而不是动词(其他类型的函数通常是动词,但不是构造函数,它们以它们构造的东西命名)。所以JsonHandler
而不是handleJson
。