Ваш конструктор не имеет оператора return, поэтому по умолчанию он возвращает это значение, которое является его новым экземпляром. Элемент, созданный createElement , оставлен для сборки мусора.
Возможно, что вы хотели сделать, это что-то вроде:
let topContainer = document.createElement('div')
// H1 constructor
function NameH1(text) {
let typeH = document.createElement('h1');
typeH.innerText = text;
return typeH;
}
let firstText = new NameH1('Hello world!');
topContainer.appendChild(firstText);
document.body.appendChild(topContainer);
Использование конструктора таким способом несколько бесполезно, поскольку он не использует никаких специальных свойств конструктора и просто означает больше ввода с помощью new .
Рассмотрим вместо этого универсальную функцию, которая принимает тег и параметры для добавления в качестве атрибутов, например
function genElement(tagName, options) {
let props = ['textContent','innerHTML'];
let el = document.createElement(tagName);
Object.keys(options).forEach(key => {
// Add properties
if (props.includes(key)) {
el[key] = options[key];
// Add attributes
} else {
el.setAttribute(key, options[key]);
}
});
return el;
}
let h1 = genElement('h1',{id: 'h0', textContent: 'Hello World!'});
console.log(h1.outerHTML);
document.getElementById('d0').appendChild(h1);
<div id="d0"></div>
Однако вы можете быстро получить множество if..else блоков с различной логикой для атрибутов, свойств, данных- * атрибутов, классы, логические атрибуты, слушатели и т. д. (например, как приведенный выше очень ограниченный пример со свойствами и атрибутами).
Создание такой функции - полезный опыт обучения, позволяющий обнаружить многие из особенностей HTML иDOM, особенно в отношении атрибутов и свойств. Но я думаю, что со временем это станет кошмаром по совместимости и обслуживанию.