如何在创建新的时创建具有已定义设置的对象/功能?

时间:2013-08-15 08:12:15

标签: javascript

我希望做这样的事情:

function Student (id, class) {
  var id = id
  var class = class

  this.get = function (subject) {
    $.ajax({
      url: 'myurl',
      data: { id: id, class: class, subject: subject },
      success: function (r) { return r }
    })
  }
  this.set = function (subject, mark) {
    $.ajax({
      url: 'myurl',
      method: 'post',
      data: { id: id, class: class, subject: subject, mark: mark },
      success: function (r) { return r }
    })
  }
}

我的问题是如何修改我的功能,以便我可以创建新学生

var s1 = new Student (22, 4) // to set predefined id & class

但是,我想要设置并得到如下(如jquery set& get)

s1("math") // to get 
s1("history", 70) // to set

**

  

所以我认为答案不可能作为存储属性id&的对象。类和函数调用就像没有函数名的函数。谢谢你的回答。

**

3 个答案:

答案 0 :(得分:2)

  1. 您可以查看调用者提供的参数数量。或者检查未定义的值。

    function test(a, b) {
      // both ifs check b was not provided
      if (typeof b === "undefined") {
      }
      if (arguments.length == 1) {
      }
    }
    
  2. 您当前的功能可能无法正常工作,因为您正在从回调中返回。 AJAX(在大多数情况下)是异步的。因此,在您的情况下,您必须添加另一个参数来提供回调。

    this.get = function (subject, callback) {
      $.ajax({
        url: 'myurl',
        data: { id: id, class: class, subject: subject },
        success: function (r) { callback(r); }
      })
    }
    
  3. 仅供参考,class是ECMAScript规范的保留关键字。

答案 1 :(得分:0)

function sample(x,y){
id=x;
subjectClass =y;
if(arguments.length == 1){
//getter
}
else{
//setter
}
}

调用getter

sample("maths")

呼叫设定者

sample("history",70);

注意:

class是保留关键字,因此请将其删除,您可以使用其他变量名称

答案 2 :(得分:0)

  

但是,我想要设置并获得如下

这意味着s1将是一个函数,而不是Student实例。所以你的构造函数需要返回它。

function student(id, klass) {
    // no need to declare variables here that are parameters already
    return function(subject, mark) {
        var data = {id: id, class: klass, subject: subject},
            opt = {url: 'myurl', data: data};
        if (arguments.length > 1) { // something was given to `mark`
            data.mark = mark;
            opt.method = "post";
        }
        return $.ajax(opt);
    };
}

顺便说一句,因为你不能return the response from an ajax call,该函数将返回jqXHR的承诺:

var s1 = student(22, 4); // `new` is unnecessary now
s1("math").then(function(r) { console.log("got maths result:", r); });
s1("history", 70).then(function(r) { console.log("successfully set marks"); });