0

我有这个 JS 文件

function APIAccess(){
    this.LoadScreen = function(){
        var loadScreen = $('#loadScreen');
        if(loadScreen.html() == undefined){
            loadScreen = '<div id="loadScreen" style="display: none;width: 100%; height: 100%; top: 0pt;left: 0pt;">' + 
                             '<div id="loadScr" style="filter: alpha(opacity = 65);  z-index: 9999;border: medium none; margin: 0pt; padding: 0pt; width: 100%; height: 100%; top: 0pt;left: 0pt; background-color: rgb(0, 0, 0); opacity: 0.2; cursor: wait; position: fixed;"></div>' +
                             '<div id="loader"  style="z-index: 10000; position: fixed; padding: 0px; margin: 0px;width: 30%; top: 40%; left: 35%; text-align: center;cursor: wait; ">' +
                             '<img src="img/ajax-loader.gif" alt="loading" /></div></div>';
            $(document.body).append(loadScreen);
        }
    };

    this.APICall = function(url, params, method, callback){
        this.LoadScreen();  
        var postData = null;
        if(params != null){
            postData = JSON.stringify(params);
        }   
        if(url.toLowerCase().indexOf("http") < 0){
            url = "http://" + url;
        }   
        $('#loadScreen').show(function(){
            $.ajax({
              url: url,
              async: true,
              type: method,
              data: postData,
              success: function(data){
                $('#loadScreen').hide();
                callback(data);
              },
              error:function(data){
                  alert("failure");
                  return false;
              }   
            }); 
        });
    };
}

function Domain(reqCallback){
    this.url = 'http://beta.test123.net/api/domain';
    this.params = null;
    this.method = 'GET';
    this.callback = function(data){
        setCookie("domain", data);
        if(typeof reqCallback != null){
            reqCallback(data);
        }
    };
    this.request = this.APICall(this.url, this.params, this.method, this.callback);
}
Domain.prototype = new APIAccess;

function Login(usermail, pass, reqCallback){
    var domainUrl = getCookie("domain");
    if(domainUrl == null)
        return false;
    else
        domainUrl += '/api/login';

    this.url = domainUrl;
    this.params = {"email": usermail, "password": password};
    this.method = 'POST';
    this.callback = function(data){
        setCookie("login", data);
        if(typeof reqCallback != null){
            reqCallback(data);
        }
    };
    this.request = this.APICall(this.url, this.params, this.method, this.callback);
}
Login.prototype = new APIAccess;

如果您看到该方法this.request = this.APICall(this.url, this.params, this.method, this.callback);将每次重复。我希望它可以放在 APIAccess 函数中。你能建议可以做什么吗?

我在我的html中使用这个

$(document).ready(function(){
            var domain = new Domain(function(data){
                alert(data);
            });
            domain.request;
        });
4

2 回答 2

1

我不确定这是否是您所要求的,下面代码中最重要的部分是我使用 Object.create() 而不是对象原型从基类“继承”如果您想学习为什么?访问https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

希望能帮助到你 :)

//Base class
var APIAccess = {

    LoadScreen : function () {
        var loadScreen = $('#loadScreen');
        if (loadScreen.html() == undefined) {
            loadScreen = '<div id="loadScreen" style="display: none;width: 100%; height: 100%; top: 0pt;left: 0pt;">' +
                             '<div id="loadScr" style="filter: alpha(opacity = 65);  z-index: 9999;border: medium none; margin: 0pt; padding: 0pt; width: 100%; height: 100%; top: 0pt;left: 0pt; background-color: rgb(0, 0, 0); opacity: 0.2; cursor: wait; position: fixed;"></div>' +
                             '<div id="loader"  style="z-index: 10000; position: fixed; padding: 0px; margin: 0px;width: 30%; top: 40%; left: 35%; text-align: center;cursor: wait; ">' +
                             '<img src="img/ajax-loader.gif" alt="loading" /></div></div>';
            $(document.body).append(loadScreen);
        }
    },

    APICall : function (url, params, method, callback) {
        this.LoadScreen();
        var postData = null;
        if (params != null) {
            postData = JSON.stringify(params);
        }
        if (url.toLowerCase().indexOf("http") < 0) {
            url = "http://" + url;
        }
        $('#loadScreen').show(function () {
            $.ajax({
                url: url,
                async: true,
                type: method,
                data: postData,
                success: function (data) {
                    $('#loadScreen').hide();
                    callback(data);
                },
                error: function (data) {
                    alert("failure");
                    return false;
                }
            });
        });
    },

    //added to base class
    url : null,
    params : null,
    method : null,
    callback : null,
    request : function(){
        //TODO validate url, params and method here
        APICall(this.url, this.params, this.method, this.callback);
    }
}


var Domain = function(reqCallback) {
    var obj = Object.create(APIAccess);
    //obj.prototype = APIAccess;
    obj.url = 'http://beta.test123.net/api/domain';
    obj.params = null;
    obj.method = 'GET';
    obj.callback = function (data) {
        setCookie("domain", data);
        if (typeof reqCallback != null) {
            reqCallback(data);
        }
    };
    return obj;
}

var Login = function (usermail, password, reqCallback) {
    var domainUrl = getCookie("domain");
    if (domainUrl == null){
        return false;
    }
    else{
        domainUrl += '/api/login';
    }

    var obj = Object.create(APIAccess);
    //obj.prototype = APIAccess;
    obj.url = domainUrl;
    obj.params = { "email": usermail, "password": password };
    obj.method = 'POST';
    obj.callback = function (data) {
        setCookie("login", data);
        if (typeof reqCallback != null) {
            reqCallback(data);
       }
    }
    return obj;
}


//Code below is just for testing
function getCookie(str){
    return 'test';
}

console.log(
    new Domain(function(data){alert(data);}), //domain
    new Login( //loging
        'user',
        'passwd',
        function(data){alert(data);}
    )
)
于 2013-05-14T14:38:31.790 回答
1

OweRReLoaDeD 的回答是正确的,但更简洁地说:

您不应该仅仅为了设置继承而实例化基类。

Domain.prototype = new APIAccess;

应该

Domain.prototype = Object.create(APIAccess);

话虽如此,您所建模的内容在继承方面看起来有点奇怪,希望我有时间提出一种不同的方式。

于 2013-05-14T14:41:54.167 回答