Скорее всего, вы уже видели «новое» повсюду. «новое» это, «новое» то. Но что именно делает «новое»? Мы знаем, что он возвращает какой-то новый объект, похожий на функцию-конструктор, из которой он появился, но не ТОЧНО такой же. Итак, как это работает?

На самом деле это очень просто. «Новый» оператор выполняет четыре основных шага:

  1. Он создает совершенно новый, пустой объект
  2. Он связывает this с новым объектом, который мы только что создали.
  3. Он автоматически присваивает прототипу «указатель» на объект-прототип конструктора.
  4. Он автоматически возвращает новый, свежий объект.

Имеет смысл? Круто, тогда вы можете перестать читать и заняться своими делами. Если нет, то здорово, потому что это означает, что я не зря написал эту статью, и моя жизнь снова обрела смысл. Мы собираемся пройти шаги один за другим.

Давайте представим, что мы открываем булочную и нам нужно выпустить как можно больше вкусов кексов. Да, мы продаем только кексы, потому что это единственное, что мы умеем делать прямо сейчас. (После того, как мы закончим здесь, мы возьмем уроки выпечки.)

Вот наша функция-конструктор кекса:

const Cupcake = function (cake, frosting, topping) {
  this.cake = cake;
  this.frosting = frosting;
  this.topping = topping;
}

Мы собираемся сделать наш первый вкус, Red Velvet, используя причудливое ключевое слово «новый».

const redVelvet = new Cupcake('red velvet', 'cream cheese', 'none')

«new» выполнит те же шаги, которые мы описали ранее:

  1. Создает пустой объект
{};

2. Связывает это с нашим новым объектом

{ 
  cake: 'red velvet',
  frosting: 'cream cheese',
  topping: 'none'
};

3. Назначает прототип объекта для делегирования объекту-прототипу конструктора. Любые методы, не найденные в прототипе объекта, будут искаться в прототипе конструктора.

redVelvet.__proto__ === Cupcake.prototype; // returns true

(Примечание: объект-прототип на самом деле не виден, если вы попытаетесь выполнить console.log наш новый объект, но поверьте мне, что этот шаг произойдет. Если вы мне не доверяете, что я понимаю, потому что мы только что встретились, продолжайте и попробуйте вышеизложенное и посмотрите, что вернется.)

4. Возвращает объект для присвоения переменной redVelvet

const redVelvet = {
  cake: 'red velvet',
  frosting: 'cream cheese',
  topping: 'none'
};

И тогда мы закончили! Хороший! Ключевое слово «новое» делает за нас всю тяжелую работу, пока мы сидим и читаем статьи на Medium. Все, что нам нужно сделать, это использовать «new» с функцией-конструктором.

Теперь у нас есть кекс Red Velvet. Но не всем нравится Red Velvet, так что давайте побыстрее выпустим другие вкусы, потому что наш магазин открывается через пару часов, и мы ждали до последней секунды, потому что это один из многих наших личных недостатков, и мы работаем над этим, хорошо? Хорошо.

const birthday = new Cupcake('confetti', 'vanilla', 'sprinkles');
const tripleChocolate = new Cupcake('chocolate', 'chocolate', 'chocolate shavings');
const reeses = new Cupcake('chocolate', 'peanut butter cream', 'crumbled reeses');

Взгляните на наши свежеиспеченные объекты из нашей простой печи-конструктора.

const birthday = {
  cake: 'confetti',
  frosting: 'vanilla',
  topping: 'sprinkles'
};
const tripleChocolate = {
  cake: 'chocolate',
  frosting: 'chocolate',
  topping: 'chocolate shavings'
};
const reeses = {
  cake: 'chocolate',
  frosting: 'peanut butter cream',
  topping: 'crumbled reeses'
};

Итак, мы подходим к концу этой статьи, и вы можете спросить себя, почему я должен использовать «новый», когда я мог бы легко ввести эти объекты один за другим? Отличный вопрос, вы глубоко мыслите.

Ключевое слово «новое» может сэкономить буквально сотни (или более) строк кода. Конечно, мы сделали здесь кое-что, но что, если наша пекарня станет общенациональной и нам понадобятся тысячи кексов? Было бы довольно сложно пробираться через такое количество строк кода, когда мы ищем что-то конкретное. «Новый» делает наш код более читаемым и является более удобным для человека способом выразить то, что мы пытаемся сделать.

Кроме того, лучшей функцией (по моему скромному мнению) является наследование прототипа от конструктора. При этом мы можем написать методы только один раз, и все наши экземпляры будут иметь доступ. Если нам нужно внести изменения в метод, нам нужно внести изменения только один раз, вместо того, чтобы вручную редактировать каждый отдельный объект.

Довольно мило, правда? (видишь, что я там делал?)

В любом случае, попробуйте это «новое» ключевое слово, посмотрите, что вы найдете, и сообщите мне, насколько оно полезно. Бьюсь об заклад, вы спросите себя, почему никто не использует слово «новый».