将jQuery ajax回调参数定义为现有对象类型

时间:2012-01-21 15:28:15

标签: javascript jquery object callback

我承认这个问题正在达到我所知道的JavaScript和极限。 jQuery,并且可能有更合适的方式来陈述我的问题(这将有助于找到现有的解决方案),但如果你能忍受我,这就是我所追求的。

我已经定义了一个现有的对象类。我正在使用getJSON进行jQuery ajax调用,并且我希望将我的回调参数(这是一个对象)归类为我的自定义对象,以便我可以从中访问该类的方法。

所以我有一些对象类

function Boo() {

  this.param1;
  this.param2;

  this.yah = function() {
     ...
  }

}

然后我有其他类似的东西

$.getJSON(url,function(new_instance) {
   //from my php source this passed object is already loaded with param1, param2...
   alert(new_instance.param1);    //no probs
   //but i want to be able to then call
   new_instance.yah();
});

换句话说,我希望将new_instance视为Boo()的一个实例。我知道像ActionScript这样的东西,你必须按照这个原因对输入参数进行分类,不知道我在JS中有多大的灵活性。

我想可能有一个中间函数接收传入对象并创建/填充Boo()的新实例但不确定是否有更聪明的方法。

非常感谢!!

2 个答案:

答案 0 :(得分:1)

不要在构造函数中定义方法 每次在costructor中反复定义它们 叫做。将它们移动到原型:

Boo.prototype = {

    yah: function() {

    },

    bah: function() {

    }

    ...

};

一个小帮手功能:

function coerceTo( proto, values ) {
    var r = Object.create( proto );
    for( var key in values ) {
        r[key] = values[key];
    }

    return r;
}

根据浏览器的不同,Object.create可能不可用,因此:

if (!Object.create) {
    Object.create = function (o) {
        if (arguments.length > 1) {
            throw new Error('Object.create implementation only accepts the first parameter.');
        }
        function F() {}
        F.prototype = o;
        return new F();
    };
}

用法:

new_instance = coerceTo( Boo.prototype, new_instance );

new_instance instanceof Boo //true
new_instance.yah();

答案 1 :(得分:0)

你能做什么:

$.getJSON(url,function(newObjData) {
   var newObj = $.extend(new Boo(), newObjData);
   newObj.yah();
});

另外,请考虑将Boo方法移至对象prototype,以便不为每个Boo实例重新创建方法:

var Boo = function() {
    this.param1;
    this.param2;
}

Boo.prototype.yah = function() {
    console.log(this.param1);
}