如何定义对象外部的方法

时间:2014-06-10 22:57:14

标签: javascript oop

我是OOP的新手。我有很多ajax调用,我想把它们组合成一个对象。

这是我的功能;

var Ajax_call = function(target) {
    this.target = target;
    this.data = function(){
        return $("#"+this.target+"").parent("form").serialize();
    };
    this.start = function(){
        status(true);
        var data = this.data();
        $.ajax({
            type : "post",
            url : $("#"+this.target+"").attr('action'),
            data : data + '&ajax=' + 1,
            dataType : "json",
            timeout : 3000,
            success : 
                function(serv){
                    if(serv.error){
                        this.denied();  ///// TypeError: undefined is not a function 
                        }
                    if(serv.done){
                        //this.succeed();
                        }
                    },
            error :
                function(x,t,m){
                    //this.failed();
                }
        });
    };

};

我想在这里定义 denied()方法;

$('body').on('click','#register_submit',function(event){
    event.preventDefault();
    Ajax_call.denied = function() {
        console.log (serv.error);
    };
    var register = new Ajax_call((this.id));
    register.start();
});

谢谢!


这是解决方案;

我将重复变量this定义为_this。所以当js重载时,我可以使用_this代替this。不需要原型。

宣言;

var Ajax_call = function(target) {
    this.target = target;
    this.data = function(){
        return $("#"+this.target+"").parent("form").serialize();
    };
    this.denied;
    this.start = function(){
        var _this = this; /// Js overload on this.
}

Ajax部分;

    $.ajax({
        type : "post",
        url : $("#"+this.target+"").attr('action'),
        data : data + '&ajax=' + 1,
        dataType : "json",
        timeout : 3000,
        success : 
            function(serv){
                if(serv.error){
                    _this.denied(serv);  ///// Fixed
                    }
                if(serv.done){
                    //_this.succeed();
                    }
                },
        error :
            function(x,t,m){
                //_this.failed();
            }
    });

用法;

$('body').on('click','#register_submit',function(event){
    event.preventDefault();
    var register = new Ajax_call((this.id));
    register.denied = function(serv) {
        console.log (serv.error);
    };
    register.start();
});

2 个答案:

答案 0 :(得分:0)

这是this的范围问题,因为this在回调函数中具有特殊含义(即,指向调用回调的对象)。将this保存在本地变量中,稍后再使用。请参阅下面的示例。

this.start = function(){
        var self = this;
        status(true);
        var data = this.data();
        $.ajax({
            type : "post",
            url : $("#"+this.target+"").attr('action'),
            data : data + '&ajax=' + 1,
            dataType : "json",
            timeout : 3000,
            success : 
                function(serv){
                    if(serv.error){
                        // this is replaces with self variable
                        self.denied();  ///// TypeError: undefined is not a function 
                        }
                    if(serv.done){
                        //this.succeed();
                        }
                    },
            error :
                function(x,t,m){
                    //this.failed();
                }
        });
    };

答案 1 :(得分:0)

this中的this.denied();指的是成功函数,而不是Ajax_call。因此,稍后设置denied方法是有效的,但由于JS如何重载this而无法正常查看。

您可能想要的是使用underscore.js's bind()等内容将this绑定到该成功函数。

这看起来像是:

// ...
success: _.bind(function(serv){
    if(serv.error){
        this.denied();
    }
    if(serv.done){
        //this.succeed();
    }
}, this),
// ...