Основная проблема в том, что box
не создает элемент DOM. Вы не можете просто добавить какой-либо объект в DOM, это должен быть какой-то узел DOM (элемент, текстовый узел и т. Д. c.).
Если у вас есть box
, создайте Элемент DOM, вы не захотите хранить width
, height
и color
на нем напрямую, только в его style
объекте.
Поскольку объект создается при использовании new
будет выброшен, я бы использовал createBox
вместо этого, а не new
с ним:
function createBox(width, height, backgroundColor) {
const element = document.createElement("div");
element.style.width = width + "px";
element.style.height = height + "px";
element.style.backgroundColor = backgroundColor;
return element;
}
document.body.appendChild(
createBox(100, 100, "red")
);
Если вы не хотели создавать элемент DOM, то проблема с this.style.width=width
заключается в том, что он пытается назначить undefined
, потому что this
не имеет style
свойство, поэтому this.style
равно undefined
. Если вы хотите создать объект из различных свойств, вы можете использовать литерал объекта:
function Box(width, height, color) {
this.width = width;
this.height = height;
this.color = color;
this.style = {width, height, backgroundColor: color};
}
(обратите внимание, что я изменил box
на Box
. Подавляющее соглашение в JavaScript заключается в том, что конструктор функции (те, которые вы вызываете через new
или аналогичные) начинаются с символа верхнего регистра.)
Но если вы вместо этого создаете элемент DOM, он уже будет иметь объект style
.
Я должен отметить, что я использовал сокращенные свойства для width
и height
, которые были добавлены в ES2015 и поэтому поддерживаются почти повсеместно, но не устаревшими браузерами, такими как IE11. Если вам нужно их поддержать, используйте вместо этого длинную форму (width: width
).
Вы также можете изучить синтаксис ES2015 class
, который позволяет вам создавать функции-конструкторы и заполнять объект, который они назначают как прототип экземпляров в более сжатой и менее подверженной ошибкам форме. Если вам нужно настроить таргетинг на браузеры, поддерживающие только ES5, для вас есть такие инструменты, как Babel.