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. Если мы его раскроем то обнаружим еще кучу ключей объектных литералов. И ими мы можем пользоваться, так как они доступны нашему объекту. Хотя сейчас будет не совсем понятно что они делают, так как в основном это все методы, но мы с ними разберемся позже. Остается вопрос – почему они нам доступны?

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

Как видите, все свойства которые мы не создавали сгруппированы в прототип с именем Object. И наш объект просто их наследует.

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

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

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

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

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

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

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

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

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

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

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