在ajax调用中阻止来自JS对象的函数

block functions from JS objects in ajax call

本文关键字:JS 对象 函数 ajax 调用      更新时间:2023-09-26

我遇到了一个以前从未见过的问题。通常,当我构建JS"类"时,我只会做简单的对象样式。。。

var page = {
    add: function(k, v) {
        this[k] = v;
    }
}

我最近尝试使用var page=function(){blah blah}page.prototype={style,但现在当我试图通过ajax发送东西时,一切都会中断。我放入控制台日志,试图查看发生了什么,似乎在ajax调用中,对象被转换为窗口范围,然后函数被参数化。可怕的解释,我很抱歉,这是代码,也许它会更有意义…

var bioLocation = function(obj) {
    this.ID = 0,
    this.name = '',
    this.address = '';
    if(typeof obj != 'undefined') {
        return this.init(obj);
    }
}
bioLocation.prototype = {
    init: function(obj) {
        for(var index in obj) {
            this[index] = obj[index];
        }
    }
}

显然是我实物的精简版,但却是完美的再现。因此,在代码的后面,我有一个按钮,甚至可以通过ajax发送数据来保存这样的东西

$('.save').click(function() {
    var postData = {};
    var saveTest = new bioLocation({ID: $('.whatever').val()});
    postData.locations = saveTest;
    var reply;
    $.ajax({
        async: false,
        type: "POST",
        data: postData,
        dataType: 'json',
        success: function(msg) {
            reply = msg;
        }
    });
});

同样,很明显,这是我代码的一个非常简化的版本,但基本上符合目标。问题是我犯了一些非常奇怪的错误。。。"无法读取undefined的属性'undefine'"该行将直接指向bioLocations原型中init函数的第二行。

在整个代码中,我已经做了大量的控制台日志,当我把它们放在init方法中时,它会记录两次,一次是在click函数中创建对象时,一次在ajax调用中。这是控制台日志中的代码…

var bioLocation = function(obj) {
    this.ID = 0,
    this.name = '',
    this.address = '';
    if(typeof obj != 'undefined') {
        return this.init(obj);
    }
}
bioLocation.prototype = {
    init: function(obj) {
        console.log(this);
        for(var index in obj) {
            this[index] = obj[index];
        }
    }
}

所以当我点击提交按钮时,我会得到2个控制台日志,第一个显示。。。

bioLocation{ID:5,名称:",地址:"}

然后第二次登录时(仍在同一点击事件中),它将登录。。。

窗口{顶部:窗口,窗口:窗口,位置:位置,外部:对象…}

然后我会得到错误"无法读取未定义的属性'未定义'"

我不明白为什么它会记录两次,更不明白为什么第二次记录的是Window对象。ajax调用似乎试图序列化函数并获取错误,但当对象作为参数传递到ajax中时,我从未见过原型被序列化。我可以确认,它实际上是在尝试对函数进行参数化,因为通过更多的日志记录和头发拉动,我实际上能够在网络选项卡中看到ajax调用,而且它确实将init:undefined作为传递到ajax页面的参数之一。

所以我想我的问题是,当使用jquery的ajax函数作为参数时,如何阻止它参数化对象的原型部分?那么,它到底为什么要在通话中添加原型呢?

求你了,你得帮帮我,我在这里疯了。我从来没有见过这样的事。提前谢谢。

构造函数需要返回新对象,而不是init函数的返回值。省略return,默认返回this。你也有逗号,你应该有分号。按照惯例,类是大写的。

var BioLocation = function (o) {
    this.ID = 0;
    this.name = '';
    this.address = '';
    if (typeof o !== 'undefined') {
       this.init(o);
    }
}
BioLocation.prototype = {
    init: function (o) {
        for (var i in o) {
            this[i] = o[i];
        }
    }
};
var saveTest = new BioLocation({ ID: 5 });
console.log(saveTest);