通过AJAX请求发送带有函数的普通javascript对象会导致调用此函数。 为什么会这样? 发送JSON数据时不会发生此问题。 将该对象转换为JSON的最佳方法是什么?
我附上了表示此行为的示例代码。
var A = (function () {
function A(value) {
this.value = value;
}
A.prototype.getValue = function () {
console.log('getValue');
return this.value;
};
return A;
})();
$(document).ready(function () {
var a = new A(10);
var xhr = $.ajax("http://example.com/", {
data: a,
type: 'post',
error: function (data) {
console.log('error');
},
success: function (data) {
console.log('success');
},
crossDomain: true
});
}
代码输出为:
getValue
success
答案 0 :(得分:1)
这是因为jQuery.param
(由jQuery.ajax
内部使用)在序列化请求参数时使用函数的返回值。 From the docs:
从jQuery 1.3开始,使用函数的返回值而不是函数作为String。
因此,当jQuery.param
遇到您的a
对象并将getValue
属性视为函数时,它会调用该函数并使用(序列化的)返回值。
无论哪种方式,为什么要将这样一个复杂的对象作为请求数据传递?如果您不想将该函数与请求数据一起传递,则最好为A
类创建自定义序列化函数,例如:
A.prototype.serialize = function() {
return { value: this.value };
}
并改为使用:
var xhr = $.ajax("http://example.com/", {
data: a.serialize(),
// ...
});