通过AJAX发送数据时调用对象的函数

时间:2014-03-05 22:41:16

标签: javascript jquery ajax json object

通过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 

1 个答案:

答案 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(),
    // ...
});