为什么jQuery.ajax()调用我的对象函数?

时间:2013-02-21 23:45:30

标签: javascript jquery

我遇到的问题是jQuery.ajax()正在调用我的数据对象函数。例如,我有一个类似于以下的对象结构:

var TestFactory = (function () {
    var _id;
    var _attributes;

    return {
        createObject: function (objectId) {
            var value = null;
            _id = objectId;
            _attributes = {};

            function _showErrorStatus() {
                $('label')
                    .css('background-color', 'red')
                    .css('color', 'black')
                    .text('jQuery called me...');
            }

            function _attr(key, value) {
                if (value == null) {
                    return _attributes[key];
                }

                _attributes[key] = value;

                return this;
            }

            return {
                id: _id,
                attributes: _attributes,
                showErrorStatus: _showErrorStatus,
                attr: _attr,                
            }
        }
    }
})();

我想将此对象用作jQuery.ajax()调用的数据值,如下所示:

var myObject = TestFactory.createObject(12345);

myObject.attr('name', 'Fred Flinstone');

$.ajax({
    url: '/echo/json/',
    type: 'GET',
    data: myObject,
    dataType: 'json',
});

我遇到的问题是jQuery.ajax()从工厂返回的对象调用showErrorStatus()函数 - 在我的代码中我是否调用此函数。

我喜欢使用此对象的OOP特性,所以有没有办法处理这种情况而没有重大改写(例如,从“类”中删除所有功能)?

注意:我发现很难解释这个问题,所以这里有一个完整的example on jsfiddle

4 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为它是一个功能,尽管我没有记录。

如果传递一个对象,则它假定您希望它调用任何对象属性值的函数。

答案 1 :(得分:2)

使用JSON.stringify(不是jQuery方法)。

$.ajax({
    url: '/echo/json/',
    type: 'GET',
    data: JSON.stringify(myObject),
    dataType: 'json',
});

http://jsfiddle.net/HJ9AS/10/

答案 2 :(得分:1)

这样做的一种方法是使用像Underscore的pick()这样的函数。它可用于从对象中挑选您需要的某些属性。无论如何它都是一个有用的库,但如果你愿意,你也可以实现这个简单的方法。

$.ajax({
    url: '/echo/json/',
    type: 'GET',
    /* only send id and attributes! */
    data: _.pick(myObject, 'id', 'attributes'),
    dataType: 'json',
});

永远白名单可能是个好习惯,而不是盲目地发送所有内容。准确指定要发送的内容可以使您免于未来的惊喜(例如您刚刚遇到的那个)。大多数情况下,您根本不想发送存储在对象中的所有内容。

您还可以通过某种方式让对象能够返回其可发送的竞争对象。它可以获得一个.getJSON()方法,只从对象中收集要发送的所有内容。


关于函数调用:

处理data属性使用$.param(),其中包含以下内容:

  

从jQuery 1.3开始,使用函数的返回值而不是函数作为String。

这是一个功能,而不是一个bug :)。我理解它背后的逻辑,因为如果对象中有一个函数你刚刚指定为要发送的数据,那么它背后必然有一个很好的理由......

答案 3 :(得分:-1)

而不是传递data: myObject

尝试设置:var serializedObject = myObject.param()

然后传递data: serializedObject

查看jQuery的param函数here