JavaScript: Может ли функция конструктора создать объект documentElement? - PullRequest
2 голосов
/ 20 августа 2009

Я хочу сделать функцию конструктора, которая создает объект documentElement.

В качестве примера рассмотрим новый конструктор Audio () - он создает объект documentElement, а если вы передаете ему некоторые переменные, он заполняет новый documentElement атрибутами. Он не вставляет его в DOM, он просто создает объект.

Итак, вопрос в том, что отличает documentElement от ванильного объекта javascript (типа {property: value}), и вы можете написать для них конструкторы, как вы можете для объектов?

Edit:

То, с чем я играю, - это воссоздание нового конструктора Audio () в браузерах, в которых его нет, с использованием QuickTime или FlashObjectElement вместо HTMLAudioElement.

Это нормально для меня, что audio.constructor будет ссылаться на HTMLObjectElement, поскольку в результате использования нового Audio () в браузерах, которые его поддерживают, audio.constructor ссылается на HTMLAudioElement.

Я не уверен насчет Audio.prototype. Когда я запрашиваю console.log (Audio.prototype) в браузерах с поддержкой Audio, они вообще ничего не возвращают - даже пустую строку в console.log - так что меня это озадачило. Но если я правильно понимаю, это не влияет на то, что я собираюсь сделать.

Цель состоит в том, чтобы иметь возможность кодировать с помощью конструктора Audio, и браузер должен обрабатывать его изначально или настроить экземпляр плагина, если это необходимо.

1 Ответ

5 голосов
/ 20 августа 2009

Элемент document не является простым объектом JavaScript, это объект DOM Element , который реализует общий DOM Core документ интерфейс .

Вы можете создавать documentElements с помощью document.implementation.createDocument (доступно из DOM Core Level 2 ):

function createDocument() {
 var doc = document.implementation.createDocument('http://www.w3.org/1999/xhtml',
                                                      'html',  null),
     body = document.createElementNS('http://www.w3.org/1999/xhtml', 'body');  

  doc.documentElement.appendChild(body);  
  return doc;
}

Edit:

Вы имеете в виду нечто подобное?

function ElementCreator(tagName, attributes){
    this.element = document.createElement(tagName);

    for (var i in attributes) {
      this.element[i] = attributes[i];
    }
  return this.element;
}

var anchor = new ElementCreator('a', { id: 'myLink', href:'http://google.com',
                                       innerHTML:'Link text' });
document.body.appendChild(anchor);
// <a id="myLink" href="http://google.com">Link text</a>

Однако я не вижу большого преимущества использования функции конструктора для этого.

Элемент возвращается из функции конструктора, объект instance потерян, anchor.constructor в приведенном выше примере ссылается на HTMLAnchorElement вместо ElementCreator, и для этого доступ к ElementCreator.prototype также потерял.

Было бы более разумно, если экземпляр DOM Element обернут в элемент или просто реализует простую функцию.

...