2. [[Prototype]] нашего нового объекта является новой функцией или свойством класса prototype.
3. Выполняется функция-конструктор, которая занимается инициализацией нашего созданного объекта.
Не стану утомлять вас излишними дополнительными деталями, но среди них есть одна важная, с которой мы далее познакомимся. Она связана с так называемым конструктором, упомянутым в пункте 3.
Знакомьтесь с конструктором
Конструктор — это функция (или метод), существующий внутри тела класса. Он отвечает за инициализацию создаваемых объектов, и делает он это, выполняя содержащийся в нем код, во время самого процесса создания. Эта деталь является обязательной. Все классы должны быть оснащены функцией-конструктором. Если у вашего класса таковой не имеется (как у Planet), JavaScript автоматически создаст пустой конструктор за вас.
Теперь давайте определим конструктор для нашего класса Planet. Взгляните на следующую модификацию:
class Planet {
constructor(name, radius) {
this.name = name;
this.radius = radius;
}
}
Для определения конструктора мы используем особое ключевое слово constructor, чтобы создать то, что по сути является функцией. Так как это функция, вы можете, как обычно, указать любые аргументы, которые хотите использовать. В нашем случае в виде аргументов мы указываем значения name и radius и используем их, чтобы установить свойства name и radius в нашем объекте:
class Planet {
constructor(name, radius) {
this.name = name;
this.radius = radius;
}
}
Вы можете совершать гораздо больше (или меньше) интересных действий изнутри конструктора, главное не забывать, что этот код будет выполняться каждый раз, когда мы будем создавать новый объект, используя класс Planet. Кстати говоря, вот как вы можете вызвать класс Planet для создания объекта:
let myPlanet = new Planet("Earth", 6378);
console.log(myPlanet.name); // Earth
Обратите внимание, что два аргумента, которые нам нужно указать в конструкторе, в действительности указаны в самом классе Planet. Когда создается наш объект myPlanet, запускается конструктор и значения name и radius, переданные ранее, устанавливаются в этом объекте. Рисунок 20.2 показывает, как это выглядит.
Рис. 20.2. Наш объект myPlanet содержит свойства name и radius
Хоть мы и изучаем синтаксис class и окружающие его детали, всегда помните, что все это лишь посыпка — изысканный синтаксический сахар, разработанный для облегчения вашей жизни. Если не использовать синтаксис class, то можно сделать так, например:
function Planet(name, radius) {
this.name = name;
this.radius = radius;
};
let myPlanet = new Planet("Earth", 6378);
console.log(myPlanet.name); // Земля
Конечный результат почти что идентичен тому, что мы получили с помощью class. Единственное отличие — в средствах достижения этого результата. Тем не менее не дайте этому сравнению сбить вас с верного пути, так как другие полезные варианты использования синтаксиса class уже не получится столь же легко преобразовать с помощью традиционных подходов, как мы сделали в этом примере.
Что помещается в класс
Объекты class очень похожи на функции, но имеют свои причуды. Один из помещаемых внутрь класса элементов мы уже видели — это особая функция constructor. Помимо нее в него можно поместить только другие функции и методы, а также геттеры и сеттеры. Все. Никаких объявлений и инициализаций переменных не допускается.
Чтобы все это увидеть в действии, давайте добавим функцию getSurfaceArea, которая выводит в консоль площадь нашей планеты. Внесите в код следующие изменения:
class Planet {
constructor(name, radius) {
this.name = name;
this.radius = radius;
}
getSurfaceArea() {
let surfaceArea = 4 * Math.PI * Math.pow(this.radius, 2);
console.log(surfaceArea + " square km!");
return surfaceArea;
}
}
Вызовите getSurfaceArea из созданного объекта, чтобы увидеть ее в деле:
let earth = new Planet("Earth", 6378);
earth.getSurfaceArea();
После выполнения этого кода вы увидите в консоли что-то вроде 511 миллионов квадратных километров. Хорошо. Поскольку мы упомянули, что в тело класса могут быть помещены геттеры и сеттеры, давайте их также добавим. Используем же мы их, чтобы представить гравитацию планеты:
class Planet {
constructor(name, radius) {
this.name = name;
this.radius = radius;
}
getSurfaceArea() {
let surfaceArea = 4 * Math.PI * Math.pow(this.radius, 2);
console.log(surfaceArea + " square km!");
return surfaceArea;