如何在外部文件中创建一个js原型类

时间:2013-02-02 15:40:19

标签: javascript

我用prototype:

创建了一个外部.js文件
function Logger() {
    var log = new Array("");
}

Logger.prototype.AddLine = function (value) {
    if (value) {
        Logger.log.push("\t" + value);
    }
}

Logger.prototype.ReadLog = function () {
    return this.log.join("");
}

现在我尝试在我的页面上使用它。我把我的文件包含在标题中。我有简单的js:

$(document).ready(function () {

        var log = new Logger();
        log.AddLine("User entered the page");
});

Firebug错误: TypeError:Logger.log未定义 [打破此错误]
Logger.log.push(“\ t”+ value);

任何人都可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

您正在使用四个(!)不同的log内容:

  • var log = new Logger();是包含新Logger实例
  • 的(本地)变量
  • var log = new Array("");是一个(本地)变量,其范围限定为声明的构造函数。您将无法从外部访问它
  • Logger.log.…Logger 功能对象上的属性。什么都没有,所以这一行会引发错误。
  • this.log.…是你真正想要的,是当前实例上的一个属性。

所以将脚本更改为:

function Logger() {
    this.log = [""]; // not sure why not just an empty array
}

Logger.prototype.AddLine = function (value) {
    if (value) {
        this.log.push("\t" + value);
    }
};

Logger.prototype.readLog = function () {
    return this.log.join("");
};

答案 1 :(得分:2)

要将log实例上的Logger设置为空数组,请使用this.log = [],而不是var log。后者创建一个私有变量,您无法在函数外部访问它。

此外,Logger.log表示:访问log函数上的Logger属性。在这里,您需要实例,因此请使用this.log(就像您在ReadLog中所做的那样)。