0

我正在尝试创建自己的类来将错误和消息记录到数据库中,但我对在 Javascript 中创建自定义类和方法是新手。经过大量研究,我能够将以下代码放在一起:

    function log ()
    {
    }

    log.error = function (currentFunction, logMessage)
    {
        createLog (currentFunction, logMessage, "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
        }
    }
4

4 回答 4

4

您根本没有使用类,并且您调用的第一个函数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您将它附加到原型。

MDN 有一个关于 javascript 中的对象模型的文档

于 2013-01-21T16:17:05.250 回答
0

我认为这将是组织该日志“类”的最佳方式,然后您可以根据需要执行警告功能和信息功能。

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

     },
     info : function() {

     }
}
于 2013-01-21T16:16:01.070 回答
0

你可以这样写:

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");
于 2013-01-21T16:17:32.880 回答
0

找不到 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 中的 public、private 和 protected 成员,请阅读这篇文章:http: //javascript.crockford.com/private.html

于 2013-01-21T16:22:19.867 回答