Публичные и приватные свойства и методы экземпляров
Как мы уже знаем, конструктор создает собственные свойства и методы экземпляров путем объявления переменных и функций
- Все свойства, объявленные в конструкторе с ключевым словом
this, будут публичными - Все свойства, объявленные в конструкторе с ключевым словом
varилиfunction, будут приватными
К публичным свойствам и методам экземпляра всегда есть доступ из внешнего окружения
Достаточно использовать имя экземпляра + "." + имя свойства ( метода )
при вызове метода нужно еще добавить круглые скобки после его имени
Приватные свойства ( и методы ) экземпляра недоступны извне они не отображаются в консоли при выводе объекта
1var Person = function ( name, age ) {23 var defaultName = "John"45 this.name = name || defaultName6 this.age = age || 2578 function showName ( name ) {9 console.log ( `My name is ${ name }` )10 }1112 this.changeName = function ( newName ) {13 this.name = newName14 showName ( this.name )15 }16}1718var person1 = new Person( "Bob", 18 )19person1.changeName('Mike')
В этом примере defaultName и showName являются приватными свойствами экземпляра person1
name, age и changeName являются публичными свойствами экземпляра person1
В публичных методах экземпляра ( changeName ) this будет ссылкой на экземпляр ( person1 )
Важно
В приватном методе showName экземпляра контекстом вызова будет глобальный объект window
т.е. внутри метода showName this будет ссылкой на объект window
1var persons = []23persons [ 0 ] = new Person ( "Bob", 18 )4persons [ 1 ] = new Person ( "Mike", 20 )
1var Bag = function ( keyword ) {2 var money = 30003 //var keyword = key4 var documents = [5 "Passport",6 "Drive licence",7 "Diploma"8 ]9 var accessories = [10 "keys",11 "cinema tickets",12 ]13 this.content = null14 function getMoney ( sum ) {15 money -= sum16 }17 this.payment = function ( sum ) {18 if ( prompt ( "who are you ?" ) !== keyword ) return "⛔️"19 getMoney ( sum )20 console.info (21 `Money left:22 ${money} uah`23 )24 return `Totally paid: ${sum} uah`25 }2627 this.rummage = function () {28 this.content = [29 documents,30 accessories,31 money32 ]33 console.log ( `Search. Bag contents: ${ this.content }` )34 }35}3637var myCase = new Bag( `it is me` )
Конструктор Bag создает объект с приватными свойствами money, documents и accessories
С его помощью создаем экземпляр myCase
При создании экземпляра передаем ему ключевую фразу для доступа к содержимому сумочки 'it is me'
Поскольку свойства money, documents и accessories приватные, "сумка закрыта"
Посторонним нет доступа к ее содержимому
Публичное свойство content изначально имеет значение null
Это все, что вы можете увидеть в закрытой сумке
Если хозяин сумки согласится показать ее содержимое, то оно будет помещено в публичное свойство content для обозрения
Функция getMoney () доступа к деньгам ( приватному свойству money ) также является приватной, поскольку никто, кроме хозяина, не должен иметь возможность взять деньги из сумки
И есть два публичных метода:
- payment ( sum, key ) - оплата
- rummage () - таможенный досмотр
В случае совершения платежа с помощью публичного метода payment
1console.log( myCase.payment( 2000 ) )
запрашивается ключевая фраза, сверяется с установленной при создании экземпляра, и если значения совпали, то вызывается приватный метод getMoney, который уменьшает приватное свойство money на сумму платежа,
после чего публичный метод pay() с чистой совестью возвращает изъятую сумму
Если будет введена неправильная ключевая фраза, то запрос будет отклонен с возвратом "⛔️"
В случае таможенного досмотра вызывается публичный метод rummage()
1myCase.rummage()
который "выкладывает на обозрение" содержимое сумочки ( помещает его в публичное свойство content )
Теперь работники таможни могут посмотреть содержимое:
1console.log( myCase.content )
Таким образом, приватные и публичные свойства и методы помещаются в "капсулу" - объект ( экземпляр )
Это и есть инкапсуляция ( encapsultion )
Имена свойств и методов внутри "капсулы" принадлежат к пространству имен объекта
Практика
Объявить конструктор LibraryBook, с помощью которого можно создавать и редактировать объекты, хранящие информацию о книгах в библиотеке
Приватные свойства объекта:
- title (название книги),
- year (год издания),
- author (автор),
- readerName (кому выдана),
- readerData (когда выдана)
Приватный метод
giveTheBook( client, date = new Date() ): аргументы метода- client - имя читателя
- readerData - текущая дата (не обязательное поле, по умолчанию должно быть
date = new Date())
Публичные методы:
getBookInfo()- посмотреть информацию о наличии книгиgetTheBook( client )- получить книгу: проверка, что книга не выдана на руки
(приватное свойство
readerNameдолжно быть пустой строкой) - если выдана - вернуть null
- если не выдана, то вызвать приватный метод
giveTheBook( client )и вернутьbookTitle
- получить книгу: проверка, что книга не выдана на руки
(приватное свойство
returnBook()- вернуть книгу: сбросить значения приватных свойств readerName, readerData
1function LibraryBook(title,year,author){23}4var books = []5books [0] = new LibraryBook ( "Война и мир", "1995", "Лев Толстой" )6books [1] = new LibraryBook ( "Отцы и дети", "1998", "Тургенев" )7books [3] = new LibraryBook ( "Кобзарь", "2005", "Тарас Шевченко" )89console.log ( books )