如何从Javascript类中通过Ajax发送对象?

时间:2015-08-21 19:10:30

标签: javascript jquery ajax oop

我的问题标题可能没有说得好,抱歉。

我想创建一个Javascript类来简化向php页面发送信息的过程。

我使用this answer中描述的方法来创建我的课程

这是我到目前为止所做的:

var ParseObject = Class.extend({
  init: function(classname, id){
    // required properties  
    this.classname=classname;
    this.objects=[];
    this.fields=[];
    // optional properties
    if(id && id != '') this.id='';
    //this.command = command;
    //this.callback='';
    //this.parent=[];
    //this.children=[];
    //this.relation='';
  },
  set: function(field, value) {
      if(field == 'classname') this.classname=value;
      else if(field == 'callback') this.callback=value;
      else if(field == 'command') this.command=value;
      else this.fields.push(field, value);
  },
  addChild: function(obj){
      this.children ? this.children.push(obj) : this.children= [obj];
  },
  addParent: function(linkedFieldName, parentClassName, parentId){
      this.parent=[linkedFieldName, parentClassName, parentId];
  },
  addObject: function(obj){
      this.objects.push(obj);
  },
  isRelatedBy: function(relation){
      this.relation=relation;
  },
  send: function(){
        var obj = this;
        $.ajax({
              type: "POST",
              dataType: "json",
              url: "php/parseFunctions.php",
              data: {data:obj},
              success: function(response) { 
                  // do stuff 
              },
              error: function(response) {
                  // do stuff 
              }
        });
  }

});

以下是我尝试使用该课程的方法:

var testObject = new ParseObject('TestObject');
testObject.set('callback','testResopnse');
testObject.set('command','save');
testObject.set('title','New Title');
testObject.set('description','New Description');
testObject.set('stuff',['one','two','three']);
testObject.addParent(['parent', 'MeComment', 'kRh5xcpkhz']);
testObject.send();

在我到达testObject.send();

之前,一切都按预期工作

我期望将下面的对象发送到我的PHP页面:

enter image description here

但相反,我得到的是" Uncaught RangeError:超出最大调用堆栈大小"

为什么会发生这种情况,我怎样才能达到预期效果?

更新:#

Per Quentin的建议,这让我排序

var obj =$.parseJSON(JSON.stringify(this));

1 个答案:

答案 0 :(得分:4)

当您将对象传递给 // If value is a function, invoke it and return its value value = jQuery.isFunction(value) ? value() : (value == null ? "" : value); 时,jQuery将call param on it

该功能包括以下代码:

window

最终在param的上下文中调用对象中的所有函数(包括构造函数)。我没有找到所有效果,但它显然是不可取的,并且基于错误消息,导致无限递归。

这里有几个选项:

  1. 编写一个显式函数,从对象中提取您关心的数据,并将其显示为一个简单的数据结构,仅包含您可以序列化的数据类型。
  2. 将对象序列化为JSON,然后将其反序列化以删除所有函数,然后再通过data:
  3. 将其传递给data:
  4. 将对象序列化为JSON,将其作为字符串传递给contentType: "application/json",设置请求Object.defineProperty()并更改PHP以期望JSON格式的请求而不是表单格式化的请求。
  5. (我不知道这是否有效)改变构建类的方式以使用enumerable并标记所有函数,使它们不是{{1}}。我怀疑这种方法会失败,因为对象本身就是一个函数。