function MyClass() {
this.test = function () {
return 'foo';
}
}
MyClass.prototype.myMethod = function (data) {
alert(data.name);
}
var newClass = new MyClass();
setTimeout(function () {
$.ajax({
url: '/echo/html/',
data: newClass,
success: function (data) {
console.log('in success callback');
console.log('received data: ' + data);
}
});
}, 3000);
未捕获的TypeError:无法读取未定义的属性“名称”
为什么ajax会触发newClass.myMethod
?因为JSON解析?如何避免这个错误?
答案 0 :(得分:4)
这是因为jQuery在数据内部使用jQuery.param
,如果查看jQuery.param
的来源,它会调用所有函数并将结果用作数据
所以,我不知道你想做些什么来绕过它,但至少你知道它是什么
正在调用jQuery.ajax
的 jQuery.param
部分来源
// Convert data if not already a string
if (s.data && s.processData && typeof s.data !== "string") {
s.data = jQuery.param(s.data, s.traditional);
}
调用函数的 jQuery.param
部分源代码:
var prefix, s = [],
add = function (key, value) {
// => If value is a function, invoke it and return its value
value = jQuery.isFunction(value) ? value() : (value == null ? "" : value);
s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
};
<强>更新强>
您可以使用processData: false
禁用数据处理,但这意味着您需要手动处理数据
$.ajax({
url: '/echo/html/',
data: JSON.stringify(newClass), // pass the processed string
processData: false, // and add this
success: function (data) {
console.log('in success callback');
console.log('received data: ' + data);
}
});