Создание объектов через "new" в JavaScript

Создание объектов через "new" в JavaScript

WebDEV


Конструктор

Конструктором становится любая функция, вызванная через new.

Например:

Заметим, что, технически, любая функция может быть использована как конструктор. То есть, любую функцию можно вызвать при помощи new. Как-то особым образом указывать, что она – конструктор – не надо.

Но, чтобы выделить функции, задуманные как конструкторы, их называют с большой буквы: Animal, а не animal.


Детальнее – функция, запущенная через new, делает следующее:

  1. Создаётся новый пустой объект.
  2. Ключевое слово this получает ссылку на этот объект.
  3. Функция выполняется. Как правило, она модифицирует this (т.е. этот новый объект), добавляет методы, свойства.
  4. Возвращается this.

В результате вызова new Animal("псина"); получаем такой объект:

animal = {
  name: "ёжик",
  canWalk: true
}

Иными словами, при вызове new Animal происходит что-то в таком духе (первая и последняя строка – это то, что делает интерпретатор):

Теперь многократными вызовами new Animal с разными параметрами мы можем создать столько объектов, сколько нужно. Поэтому такую функцию и называют конструктором – она предназначена для «конструирования» объектов.


new function() { … }

Иногда функцию-конструктор объявляют и тут же используют, вот так:

Так делают, когда хотят создать единственный объект данного типа. Пример выше с тем же успехом можно было бы переписать как:

var animal = {
  name: "Васька",
  canWalk: true
}

…Но обычный синтаксис {...} не подходит, когда при создании свойств объекта нужны более сложные вычисления. Их можно проделать в функции-конструкторе и записать результат в this.


Правила обработки return

Как правило, конструкторы ничего не возвращают. Их задача – записать всё, что нужно, в this, который автоматически станет результатом.

Но если явный вызов return всё же есть, то применяется простое правило:

  • При вызове return с объектом, будет возвращён он, а не this.
  • При вызове return с примитивным значением, оно будет отброшено.

Иными словами, вызов return с объектом вернёт объект, а с чем угодно, кроме объекта – возвратит, как обычно, this.

Например, возврат объекта:


А вот пример с возвратом строки:

Эта особенность работы new прописана в стандарте, но используется она весьма редко.


Можно без скобок

Кстати, при вызове new без аргументов скобки можно не ставить:

Не сказать, что выбрасывание скобок – «хороший стиль», но такой синтаксис допустим стандартом.


Создание методов в конструкторе

Использование функций для создания объекта дает большую гибкость. Можно передавать конструктору параметры, определяющие как его создавать, и он будет «клепать» объекты заданным образом.

Добавим в создаваемый объект ещё и метод.

Например, new User(name) создает объект с заданным значением свойства name и методом sayHi:


Локальные переменные

В функции-конструкторе бывает удобно объявить вспомогательные локальные переменные и вложенные функции, которые будут видны только внутри:

Те функции и данные, которые должны быть доступны для внешнего кода, мы пишем в this – и к ним можно будет обращаться, как например vasya.sayHi(), а вспомогательные, которые нужны только внутри самого объекта, сохраняем в локальной области видимости.


Лучший сайт для изучения JavaScript - https://learn.javascript.ru/

Report Page