如何在JavaScript函数构造器内访问属性

3
我需要通过一个类来操作HTML标签,如下所示:
/*
 * Begin: HTML Class
 */
HTML = function(el, property) { // Construct
    this.el = el;
    this.property = new Array;
    var HTML = document.createElement(el);

    this.element = function() {
        return HTML;
    };

    HTML.objects.push(this);

    if (typeof property == "object")
        for (i in property)
            this.addProperty(i, property[i]);
};

HTML.objects = new Array; // Registers all new HTML objects.

// Adds a new property to HTML current element.
HTML.prototype.addProperty = function(name, value) {
    this.property[name] = value;
    this.getHTML()[name] = value;
};

// Retrieves current HTML element.
HTML.prototype.getHTML = function() {
    return this.element();
};

// Clones current HTML objects with same construct arguments.
HTML.prototype.clone = function() {
    return new HTML(this.el, this.property);
};
/*
 * End: HTML Class
 */

每次调用new HTML(...)时,新创建的实例必须存储在HTML.objects中,它是HTML的静态属性,其作用是跟踪所有HTML对象。但现在当它到达HTML.objects.push(this);时,它将返回undefined属性错误。之后,我尝试在Firebug中调用HTML.objects,它肯定是已定义的。由于在实例化时调用了function(...) { ... },所以它应该能够访问HTML.objects属性吗?
谢谢。

我强烈建议解决HTMLHTML之间的名称冲突。 - Bergi
此外,“HTML”是一个特别糟糕的名称,用于表示与HTML标记无关的DOM元素。同样适用于“getHTML()”方法-只需使用“element()”方法即可。 - Bergi
1个回答

2
属性HTML.objects不存在,因为您在构造函数的作用域中定义了一个名为HTML的变量。
var HTML = document.createElement(el);

因此,当您进行此调用时:

HTML.objects.push(this);

您正在尝试访问刚声明的HTML变量的属性。

实际上,如果您尝试用以下内容替换第一行:

var HTML_INNER = document.createElement(el);

它会工作


哇!现在我感到很惭愧。我之前一直在使用另一个正常工作的对象进行测试。但是在那个对象中,我没有定义一个与对象同名的内部变量。非常感谢。 - cram2208
1
另一个建议是:您在构造函数参数和对象字段中使用相同的名称“property”,但您没有在构造函数中将参数分配给字段。这可能会导致误解。 - Moppo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接