7. Объекты и прототипы

Когда вы будите писать свои программы вы обнаружите, что было бы удобно, когда одна переменная могла бы хранить несколько значений разных типов. Например, вы создаете компьютерную игру и у вас много переменных, которые отвечают за имя игрока, количество жизней, уровень и т.д. Было бы удобно все эти значения хранить в одной переменной.

И здесь нам на помощь приходят объекты. Помните я говорил что все типы данных подразделяются на элементарные и объектные. Так вот объектные типы данных в отличие от примитивных могут просто хранить в себе не одно значение, а много.

Чтобы создать объект есть несколько способов и мы пока рассмотрим только один, так как для остальных способов мы должны изучить функции и методы.

Итак сначала пишем ключевое слово let, затем имя переменной, допустим мы делаем компьютерную игру и имя будет player, далее пишем оператор присваивания и чтобы указать транслятору, что мы создаем переменную, надо поставить в качестве литерала фигурные скобки. Фигурные скобки это оператор, у которого есть два назначения, и одно из них – это создание литералов объекта. Про второе назначение я расскажу когда мы будем изучать функции и методы.

Как я говорил у объекта может быть много значений, т.е. много литералов и они записываются внутри фигурных скобок. Но объектные литералы отличаются от уже знакомых нам обычных литералов. Объектный литерал записывается так, сперва идет строка, которая называется ключом, затем идет оператор двоеточие и значение любого типа. Т.е. объектный литерал это пара ключ:значение. Давайте в качестве ключа давайте напишем “имя”, а значение будет тоже строка со значением “Maximus”, чтобы указать следующий объектный литерал надо просто поставить оператор запятая, и теперь в качестве ключа напишем “level”, а значение будет 37, т.е. теперь я использовал в качестве значения число. Также я могу написать более сложное значение, например, 37+9.

Давайте напишем следующий объектный литерал. Есть ли у персонажа ключ “Does he have a key?”, в отличие от имен переменных здесь мы можем использовать пробелы и специальные знаки, такой как вопросительный знак. А значение будет false, типо нет у него ключа.

Так как транслятор ожидает в качестве ключа строку, то кавычки мы даже можем не ставить, транслятор и так поймет что это строка. Давайте напишем количество монет Coin без кавычек. Только одно уточнение, если мы пишем ключ без кавычек, то мы не можем пользоваться пробелами и специальными знаками, т.е. все тоже самое что и с именами переменных, только есть одно отличие, в качестве ключа мы можем использовать число. Когда транслятор увидит на месте ключа число, то он его преобразует в строку.

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

Двигаемся дальше. Вот мы создали объект, а как получить доступ к этим значения, что мы в него добавили. Мы это можем сделать с помощью оператора точки.

Т.е. сперва пишем ссылку на объект, т.е. имя объекта, затем слитно пишем точку, теперь мы имеем доступ ко всем его ключам. Наберем имя name, нажимаем Enter. И вот транслятор возвращает нам значение Maximus. И так у нас есть доступ практически к любому ключу.

Почему я говорю практически? Дело в том, что если ключ является цифрой, или в его имени есть пробелы или специальные знаки, как в нашем ключе Does he have a key?, то вместо оператора точки, надо использовать оператор прямоугольные скобки, где внутри в кавычках мы пишем нужный ключ.

В этих квадратных скобках мы также можем писать ключ без если ключ не имеет пробелов и специальных знаков. Если ключ – это цифра, то его тоже можно писать без кавычек.

Давайте теперь создадим следующий массив player2. Если в качестве литерала мы укажем просто фигурные скобки, без перечисления объектных литералов, то так мы создадим пустой объект. Возникает вопрос, а как добавить в него объектные литералы. Все очень просто, мы снова должны воспользоваться точкой точкой или квадратными скобками.

Проверяем

Теперь добавим объектный литерал через квадратные скобки.

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

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

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

Если мы через точку или квадратные скобки напишем ключ, которого нет и нажмем Enter, то транслятор вернет значение undefined, так как у данного ключа он не нашел значение.

Давайте теперь просто напишу имя объекта и нажму на Enter. Транслятор вернул нам наш объект с объектными литералами. Раскроем его. Мы видим помимо нами созданных ключей еще какой-то прототип Object. Если мы его раскроем то обнаружим еще кучу ключей, для нашего объекта. И эти ключи содержат внутри себя другие ключи, как наш объект anotherObject. И ими всеми мы можем пользоваться. Хотя сейчас будет не совсем понятно что они делают, так как в основном это все методы, но мы с ними разберемся позже. Остается вопрос – почему они нам доступны?

Дело в том, внутри транслятора автоматически создается некий глобальный объект со своими свойствами и методами. Этот объект является родительским для всех остальных объектов в программе, которые и наследуют его свойства и методы. Это сделано для того, чтобы одни из самых часто используемых свойств и методов были сразу доступны вашему объекту, и вы не создавали их заново. Вот поэтому наш объект унаследовал все эти ключи. Родительский объект называется прототипом в JavaScript.

Как видите, все свойства которые мы не создавали сгруппированы в прототип Object, и это подтверждает, что все эти свойства унаследованы от глобального объекта, который называется просто Object.

Давайте теперь создадим обычную числовую переменную, допустим, со значением 17. Теперь если мы напишем имя переменной, а затем поставим оператор точка, на тоже будут доступны свойства, которые даже добавить сами не могли. Получается элементарные типы – это тоже объекты? На самом деле нет, просто для расширения возможностей элементарных типов, были придуманы специальные объекты-прототипы, которые наследуют им свои свойства. Узнать, что это за прототип мы можем с помощью свойства __proto__, который вернет нам прототип для этого типа данных.

Как видите, этот прототип называется Number, у которого есть свои свойства, и который является, так сказать дитём глобального объекта, а значит тоже наследует свойства глобального объекта и эти свойства также доступны переменной.

У остальных элементарных типов данных есть свои прототипы, которые тоже являются детьми глобального объекта. Но вы можете спросить: так если у элементарных типов есть свои свойства как у методов, чем они принципиально отличаются, почему они не входят в объектные типы.

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

Давайте создадим две переменные a и b. В переменную а запишем значение 34, а переменная b будет иметь значение переменной a. Теперь изменим значение переменной а на 23.

Затем смотрим чему равна переменная b. А она также равна 34. Ничего удивительного, ведь когда мы присваивали переменной b переменную а, мы просто копировали значение переменной а в переменную b.

Но с объектными типами все не так. Давайте создадим переменную player3 и присвоим ему объект player2.

Далее в player2 изменим имя игрока на Minimus. Проверяем это свойство у player3, а оно тоже теперь Минимус. Давайте теперь изменим уровень с помощью переменной player3. Допустим 17. Проверяем это же свойство у player2, оно тоже теперь 17.

Дело в том, когда мы присваиваем объект переменной, мы просто копируем его ссылку, а не значения его объектных литералов. Т.е. по сути две переменные player2 и player3 ссылаются на один и тот же объект. Вот основное отличие элементарных типов и объектов.

Кстати, при создании объектов, обычно не пишут в одну строчку все его объектные литералы, а делают это обычно так. сперва создаем переменную, пишем знак равно, фигурные скобки. Далее ставим курсор на между фигурных скобок, и теперь чтобы перейти на следующую строку, надо зажать кнопку Shift и нажать Enter. Программа автоматически добавила для следующей строки табуляцию, а закрывающую фигурную скобку перенесла на третью строку. Так как так оформляют объекты большинство программистов, программа что вы также все будите делать и решила некоторые моменты оформления кода взять на себя.

Далее пишем объектные литералы:

Готово! На этом урок заканчивается, до встречи на следующих уроках.

Домашнее задание. Создайте переменную с именем моиЛюбимыеФильмы, присвоите ей значение объекта, у которого ключи – это названия ваших любимых фильмов (можно перечислить 5 таких фильмов), а в качестве значения этих ключей уже будут другие объекты с такими ключами : жанр, год, режиссер; и соответствующими значениями.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *