2015-05-31 5 views
2

Мне нужно манипулировать HTML-теги через класс, как, например:Как получить доступ к собственности внутри функции конструктора Javascript

/* 
* 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);, он вернет неопределенную ошибку свойства. После этого я попытался вызвать HTML.objects в firebug, и он определенно определен. Как function(...) { ... } вызывается при создании экземпляра, не должен ли он иметь доступ к свойству HTML.objects?
Спасибо.

+0

Я бы настоятельно рекомендовал разрешить имя столкновения между '' HTML' и HTML'. – Bergi

+0

Также 'HTML' является особенно плохим именем для * * DOM * * элемента * (что не имеет никакого отношения к разметке HTML). Некоторые из них относятся к методу '.getHTML()', просто используйте '.element()' one. – Bergi

ответ

2

proprety HTML.objects не существует, потому что в рамках вашего конструктора HTML является переменной вы определили здесь:

var HTML = document.createElement(el); 

так, когда вы делаете этот призыв:

HTML.objects.push(this); 

вы пытаетесь для доступа к проре только что объявленной переменной HTML.

В самом деле, если вы пытаетесь заменить первую строку с:

var HTML_INNER = document.createElement(el); 

Он будет работать

+0

WOW! Теперь я чувствую стыд. Я тестировал его другим объектом, который работал нормально. Но в другом объекте я не определял внутренний var с тем же именем, что и объект. Большое спасибо. – cram2208

+0

Да! Прекрасное обходное решение для меня. – cram2208

+1

:) Еще один совет: вы используете одно и то же имя «свойство» для параметра конструктора и поля объекта, но вы не назначаете этот параметр в поле конструктора. Это может привести к недоразумениям – Moppo

Смежные вопросы