当我通过 ajax 发送它时,对象的方法正在被调用,而我从未调用过它

Object's method is being called, without me ever calling it, when I send it via ajax?

本文关键字:调用 方法 对象 ajax      更新时间:2023-09-26

我有一个简单的对象叫做Entry,直到最近才有几个基本属性。 在某些事件期间,我会对这些对象执行 REST 操作,以存储在 C# 代码中的 API。直到最近,这还很好。我会使用我的小请求服务将这些对象发布或放入 AJAX 请求的正文中,结果如下:

$.ajax(url, 
{
    type:method,
    headers:headers,
    data:options.data, //there is an instance of Entry in options.data
    timeout: this.timeoutLength
});

最近我在条目中添加了一个函数。

function Entry(foo, bar){
    this.foo = foo;
    this.bar = bar;
    this.doStuff = function(){ ... } //added this code
}

我添加了该功能,但再次质疑其使用背后的用户故事,所以我切换回浏览器,刷新并运行更多测试。从未在任何地方doStuff调用该函数,它的效果就被看到了。

我用一个简单的警报替换了doStuff的正文,果然,每次我在幕后执行称为带有 Entry 对象的 AJAX 请求的操作时,我都会收到警报消息。 为什么会这样?为什么doStuff没有我告诉它就被召唤了?

编辑:TLDR;Ajax 在序列化对象时调用对象中的任何函数。如果您关心原因,请继续阅读:

这让我有点疯狂,直到我设法向后跟踪堆栈跟踪。 似乎doStuff函数是由jquery-1.7.1调用的.js $.ajax但是为什么?

有问题的对象,此处的"entry",必须序列化为查询字符串,以便通过网络发送。 在这样做时,它会遍历对象的每个属性。

首先,(对我来说在第 7610 行)它检查对象是否isPlainObject .以前可能是这样,但拥有功能不再如此。相反,它会执行以下操作:

jQuery.each( a, function() {
    add( this.name, this.value );
});

它早一点定义了添加,如下所示:

add = function( key, value ) {
    // If value is a function, invoke it and return its value
    value = jQuery.isFunction( value ) ? value() : value;
    s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
};

请注意jQuery亲切地提供给我们的评论。 它遍历对象的每个属性,如果一个是函数,则使用该函数的返回值作为"键/值"对的"值"。它在这里调用doStuff以获取一个值(当然返回undefined因为该函数只是调用了一个警报)

为了我自己起见,我要补充一点,文档并没有真正明确这一点。我一直认为它忽略了功能,但好处不是它肯定不会

数据对象、字符串

要发送到服务器的数据。如果还不是字符串,则会将其转换为查询字符串。它被附加到 GET 请求的 url 中。请参阅进程数据选项以防止此自动处理。对象必须是键/值对。如果 value 是一个数组,jQuery 会根据传统设置的值序列化具有相同键的多个值(如下所述)。

最后,通过一个简单的测试(不是完全阅读代码),似乎JSON.stringify完全忽略了函数。