簡體   English   中英

如何使用方法創建自定義類

[英]How to create custom class with methods

我正在嘗試創建自己的類以將錯誤和消息記錄到數據庫中,但是我不熟悉Javascript中的自定義類和方法。 經過大量研究,我能夠組合以下代碼:

    function log ()
    {
    }

    log.error = function (currentFunction, logMessage)
    {
        createLog (currentFunction, logMessage, "Error");
    }

我可以使用以下log.error成功調用log.error函數:

    log.error("current function name", "this is my error message");

我的問題是:我瀏覽過的大多數網站都說要像這樣來組織代碼:

    function log ()
    {
        this.error = function (currentFunction, logMessage)
        {
            createLog (currentFunction, logMessage, "Error");
        }
    }

但是,每當我嘗試調用該錯誤函數時,都會出現以下錯誤:

在對象函數日志中找不到函數錯誤(currentFunction,logMessage)

有人知道為什么是這樣嗎? 為了使我的代碼保持整潔,我真的很希望能夠將所有內容放置在一個函數中,但是在這一點上,我似乎必須將所有內容都分離出來,就像上面的第一個代碼塊一樣。

編輯-我的解決方案

感謝dystroy和Jose Vega(對不起,Jose,我沒有足夠的聲譽來投票給你答案)。 我最終使用dystroy的解決方案只是因為我覺得將來對我的代碼進行維護會更容易,但是Jose的回答有助於我深入了解我正在嘗試做的事情以及可以使用的各種選擇。 當您執行var objectName = {} vs function className () {}類的操作時,我感覺要掌握得多。

這是我的新代碼:

    function log ()
    {
        log.prototype.error = function (currentFunction, logMessage)
        {
            createLog (currentFunction, logMessage, "Error");
        }

        log.prototype.warning = function (currentFunction, logMessage)
        {
            createLog (currentFunction, logMessage, "Warning");
        }

        log.prototype.info = function (currentFunction, logMessage)
        {
            createLog (currentFunction, logMessage, "Info");
        }

        function createLog (currentFunction, logMessage, messageType)
        {
            //code that updates MSSQL database
        }
    }

您根本沒有使用任何類,而調用log的第一個函數完全沒有用。

你可以寫成

var log = {}

log.error = function (currentFunction, logMessage){
    createLog (currentFunction, logMessage, "Error");
}

通常,當您創建一個新函數並希望將其視為一個類時,您會像這樣:

function log () {
}
log.prototype.error = function (currentFunction, logMessage) {
    createLog (currentFunction, logMessage, "Error");
}

然后您可以像這樣使用它:

(new log()).error("current function name", "this is my error message");

這看起來與您的第二個示例有點類似,不同之處在於,將error函數附加到原型的所有log實例均共享該error函數。

MDN 在javascript中一個有關對象模型的文檔

我認為這是組織該日志“類”的最佳方法,然后可以根據需要執行警告功能和信息功能。

var log = {
     error : function(currentFunction, logMessage) {
          createLog(currentFunction, logMessage, "Error");
     },
     warn : function() {

     },
     info : function() {

     }
}

您可以這樣寫:

var log = {
    error: function (currentFunction, logMessage) {
        createLog (currentFunction, logMessage, "Error");
    }
};

然后這樣稱呼它:

log.error("My function", "Is not working");

盡管我通常以以下方式使用jQuery編寫此代碼:

(function($) {

    //Declare object
    var _this = $.Log = new function () {

    };

    //Apply variables and methods
    $.extend(_this, {
        error: function (currentFunction, logMessage) {
            createLog (currentFunction, logMessage, "Error");
        }
    });
)(jQuery);

稍后將這樣稱呼它:

$.Log.error("My function", "Is not working");

找不到error()函數的原因是因為它位於日志對象的構造函數中-log()函數是構造函數。 這樣,您便可以在Javascript中創建私有成員,然后將其放入構造函數中。 為了使您的error()函數可見,您需要將其附加到日志對象的原型,如下所示。

function log ()
{
    log.prototype.error = function (currentFunction, logMessage)
    {
        createLog (currentFunction, logMessage, "Error");
    }
}

現在您可以這樣稱呼它:

var myLog = new log();
myLog.error("current function name", "this is my error message");

有關在javascript中解釋公共,私有和受保護成員的好文章,請閱讀此文章: http : //javascript.crockford.com/private.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM