JavaScript с нуля - [39]

Шрифт
Интервал

var shout = {

_message: "HELLO!",


get message() {

return this._message;

},


set message(value) {

this._message = value.toUpperCase();

}

};


shout.message = "This is sparta!";

console.log(shout.message);

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

Регистрирование действий

В следующем примере у нас есть объект superSecureTerminal, регистрирующий имена всех пользователей:

var superSecureTerminal = {

allUserNames: [],

_username: "",


showHistory() {

console.log(this.allUserNames);

},


get username() {

return this._username;

},


set username(name) {

this._username = name;

this.allUserNames.push(name);

}

}

Это регистрирование обрабатывается внутри сеттера username, где каждое предоставляемое имя пользователя сохраняется в массиве allUserNames, а функция showHistory выводит сохраненные имена пользователей на экран. Прежде чем продолжить, давайте протестируем этот код. Мы попробуем обратиться к superSecureTerminal не так, как делали это до сих пор. Для этого мы используем кое-какие знания о создании объектов и сделаем следующее:

var myTerminal = Object.create(superSecureTerminal);

myTerminal.username = "Michael Gary Scott";

myTerminal.username = "Dwight K. Schrute";

myTerminal.username = "Creed Bratton";

myTerminal.username = "Pam Beasley";


myTerminal.showHistory();

Мы создаем новый объект myTerminal, основанный на объекте superSecureTerminal. С этого момента мы можем делать с myTerminal все, что угодно, в привычном режиме.

Проверка значения свойства

Последним мы рассмотрим пример, в котором сеттеры производят проверку переданных им значений:

let person = {

_name: "",

_age: "",


get name() {

return this._name;

},


set name(value) {

if (value.length > 2) {

this._name = value;

} else {

console.log("Name is too short!");

}

},


get age() {

return this._age;

},


set age(value) {

if (value < 5) {

console.log("Too young!");

} else {

this._age = value;

}

},


get details() {

return "Name: " + this.name +", Age: " + this.age;

}

}

Обратите внимание, что мы производим проверку допустимого ввода для обоих свойств name и age. Если введенное имя короче двух знаков, выводится соответствующее уведомление. Если указан возраст меньше пяти, то также выскакивает уведомление. Возможность проверять, является ли присваиваемое свойству значение подходящим, вероятно, одна из лучших возможностей, предлагаемых геттерами и сеттерами.

КОРОТКО О ГЛАВНОМ

Стоит ли прекращать создавать стандартные свойства данных и использовать эти модные свойства-аксессоры? На самом деле нет. Все зависит от текущих потребностей и будущих нужд. Если вы уверены, что свойству никогда не потребуется дополнительная гибкость, предлагаемая геттерами и сеттерами, то можете просто оставить его в виде свойства данных. Если вам когда-нибудь понадобится к нему вернуться, то изменение свойства данных на свойство-аксессор полностью происходит за кадром. Мы можем делать это, не влияя на итоговое применение самого свойства. Круто, не правда ли?

Если у вас возникнут сложности в этой теме, то обращайтесь за помощью на форум https://forum.kirupa.com.

18. Об объектах подробнее

Знакомясь с объектами в главе 12 «О пицце, типах, примитивах и объектах», мы произвели очень поверхностный обзор того, чем являются объекты в JavaScript и как их воспринимать. На тот момент этого было достаточно, чтобы рассмотреть основы некоторых встроенных типов, но теперь пора двигаться дальше. В этой главе увидим, что вся предыдущая информация была лишь вершиной айсберга.

Здесь мы уже подробнее пересмотрим объекты и затронем некоторые наиболее продвинутые темы вроде объекта Object, создания пользовательских объектов, наследования, прототипов и ключевого слова this. Если все перечисленное кажется вам совершенно непонятным, то я обещаю, что к завершению главы мы это исправим.

Поехали!

Знакомство с объектом

В самом низу пищевой цепочки есть тип Object, который закладывает основу как для пользовательских объектов, так и для встроенных типов вроде Function, Array и RegExp. Практически все, за исключением null и undefined, непосредственно связано с Object или может стать им при необходимости.

Как мы уже видели, функциональность, которую предоставляет Object, весьма мала. Он позволяет определять множество именованных пар ключ — значение, которые мы с любовью называем свойствами. Это не особо отличается от того, что мы видим в других языках, использующих хэш-таблицы, ассоциативные массивы и словари.

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

Создание объектов

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

let funnyGuy = {};

Все верно. Вместо написания new Object(), как это делали еще ваши деды, мы можем просто инициализировать наш объект, используя {}. По завершении выполнения этой строки мы получим созданный объект funnyGuy с типом Object:


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

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