如何使用方法创建自定义类

时间:2013-01-21 16:13:06

标签: javascript class

我正在尝试创建自己的类来记录错误和消息到数据库,但我不熟悉在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的回答让我深入了解了我想要做的事情以及我可以使用的不同选项。当我做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 个答案:

答案 0 :(得分:3)

你根本就没有使用类,你调用它时,你的第一个名为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有a document about the object model in javascript

答案 1 :(得分:0)

我认为这是组织日志“class”的最佳方式,然后你可以根据需要警告函数和信息功能。

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

     },
     info : function() {

     }
}

答案 2 :(得分: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");

答案 3 :(得分: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中解释公共,私人和受保护成员的好文章,请阅读以下文章:http://javascript.crockford.com/private.html