Цель этого поста — сказать простыми словами о том, чем объекты и прототипы JavaScript отличаются от обычных для ООП классов и объектов, и почему модель JavaScript является более гибкой, чем классическая для ООП.
- В JavaScript всё ведёт себя, как объект.
- Абсолютно любая функция может вести себя как конструктор при помощи слова new. constr = new Func ();
- Абсолютно любой (даже пустой) объект может выступать в роли прототипа.
- Прототип имеется у каждого объекта. Например, для конструктора прототип по умолчанию — это пустой объект.
- Прототип — это не что-то особенное, как, например, «класс» в других языках. Это просто обычный объект, без каких-то дополнительных свойств или методов.
- Как ведет себя сущность в JavaScript делится между конструктором (любая функция, которая отвечает за создание и инициализацию сущности) и прототипом (задает поведение сущности)
- Любое разделяемое между объектами поведение определяется их прототипом. Например, если требуется иметь много объектов с одним и тем же методом, его лучше определить на прототипе.
- Ключевое слово this в методе, определенном на прототипе, но используемом на объекте с этим прототипом, ссылается на сам объект.
- Свойства и методы, уникальные для объекта, определяются в конструкторе.
- Любые свойства и методы прототипа доступны непосредственно в объектах, имеющих этот прототип.
- Свойства и методы прототипа могут переопределяться в конструкторе или непосредственно на объекте.
- Прототипная модель в JavaScript позволяет реализовать классическое наследование и поведение класс-объект в ООП, но также даёт делать более гибкие вещи.