Простое изменение значений свойств не сработает (как уже говорили, некоторые HTMLElement
свойства доступны только для чтения; некоторые содержат прототипный контекст для более примитивных элементов).Самое близкое, что вы можете сделать для имитации API-интерфейса DOM, - это также имитировать процесс наследования прототипов в JavaScript.
'Установка' на прототипе объекта через __proto__
обычно вызывает недовольство.Кроме того, вы можете подумать, почему вы думаете, что вам нужно дублировать весь элемент DOM в первую очередь.Но вот так:
// Define this at whatever scope you'll need to access it
// Most of these kinds of constructors are attached to the `window` object
window.HTMLBookElement = function() {
function HTMLBookElement() {
var book = document.createElement('book');
book.__proto__ = document.createElement('audio');
return book;
}
return new HTMLBookElement();
}
// Test your new element in a console (I'm assuming you have Chrome)
var harryPotter = new HTMLBookElement();
// You should have access to your new `HTMLBookElement` API as well as that
// of its prototype chain; since I prototyped `HTMLAudioElement`, you have
// some default properties like `volume` and `preload`:
console.log(harryPotter); // should log "<book></book>"
console.log(harryPotter.volume); // should log "1"
console.log(harryPotter.preload); // should log "auto"
Все элементы DOM работают таким образом.Например: <div></div>
создается HTMLDivElement
, что расширяет HTMLElement
, что, в свою очередь, расширяет Element
, что, в свою очередь, расширяет Object
.