Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将jQuery ajax回调参数定义为现有对象类型_Javascript_Jquery_Object_Callback - Fatal编程技术网

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

Javascript 将jQuery ajax回调参数定义为现有对象类型,javascript,jquery,object,callback,Javascript,Jquery,Object,Callback,我承认这个问题已经到了我对JavaScript和jQuery所知的极限,也许有一种更合适的方式来陈述我的问题(这有助于找到现有的解决方案),但如果你能容忍我的话,这就是我想要的 我已经定义了一个现有的对象类。我正在使用getJSON进行jqueryajax调用,我希望我的回调参数(它是一个对象)被分类为我的自定义对象,以便我可以从中访问该类的方法 所以我有一些对象类 function Boo() { this.param1; this.param2; this.yah = fun

我承认这个问题已经到了我对JavaScript和jQuery所知的极限,也许有一种更合适的方式来陈述我的问题(这有助于找到现有的解决方案),但如果你能容忍我的话,这就是我想要的

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

所以我有一些对象类

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();
});
换句话说,我希望将新的_实例视为Boo()的实例。我知道在ActionScript之类的东西中,你必须对传入参数进行分类,正是因为这个原因,我不知道JS有多大的灵活性

我考虑过使用一个中间函数来接收传入对象并创建/填充Boo()的新实例,但不确定是否有更聪明的方法

非常感谢

您可以做什么:

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

也可以考虑将您的代码> BOO方法移到对象<代码>原型< /COD>中,因此方法不为每个代码[Boo< <代码> >实例:< /P>重新创建。

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

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

不要在构造函数中定义方法,否则 每次构造师 被称为。将它们移到原型上:

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();

到目前为止,对于这两个回答,是的,我知道我应该进行原型设计(;D),您可能会认为我的最终产品将更高效地编写…这样调用原始构造函数可能会导致副作用或错误。好的,非常感谢这两个答案,这一个看起来非常低预算,假设我正在构建一个API,我希望能特别挑剔,让用户只使用myfunction(params,function(boo){..},并使用'boo'作为boo()马上在他们的脚本中,但是可能要求太多了!这取决于你的需要。但是我应该承认@Esailija的答案在概念上是正确的,而且更健壮。下面是我所做的,它没有正确的原型化,但总的想法是…
Boo.prototype.dp(params,callback){$.getJSON(params,function(r){if(typeof(r)='object'){//我认识到这一行可以写得更好,如上var t=new Boo();//在这里循环并加载参数(未显示)callback(t);}否则{callback(r);});另一个_instance.dp(params,function(new_instance){new_instance.yah();//万岁!});