繁体   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