HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

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

Как мы уже знаем, конструктор создает собственные свойства и методы экземпляров путем объявления переменных и функций

  • Все свойства, объявленные в конструкторе с ключевым словом this, будут публичными
  • Все свойства, объявленные в конструкторе с ключевым словом var или function, будут приватными

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

Достаточно использовать имя экземпляра + "." + имя свойства ( метода )

  • при вызове метода нужно еще добавить круглые скобки после его имени

Приватные свойства ( и методы ) экземпляра недоступны извне они не отображаются в консоли при выводе объекта

1var Person = function ( name, age ) {
2
3 var defaultName = "John"
4
5 this.name = name || defaultName
6 this.age = age || 25
7
8 function showName ( name ) {
9 console.log ( `My name is ${ name }` )
10 }
11
12 this.changeName = function ( newName ) {
13 this.name = newName
14 showName ( this.name )
15 }
16}
17
18var 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 = []
2
3persons [ 0 ] = new Person ( "Bob", 18 )
4persons [ 1 ] = new Person ( "Mike", 20 )
1var Bag = function ( keyword ) {
2 var money = 3000
3 //var keyword = key
4 var documents = [
5 "Passport",
6 "Drive licence",
7 "Diploma"
8 ]
9 var accessories = [
10 "keys",
11 "cinema tickets",
12 ]
13 this.content = null
14 function getMoney ( sum ) {
15 money -= sum
16 }
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 }
26
27 this.rummage = function () {
28 this.content = [
29 documents,
30 accessories,
31 money
32 ]
33 console.log ( `Search. Bag contents: ${ this.content }` )
34 }
35}
36
37var myCase = new Bag( `it is me` )

Конструктор Bag создает объект с приватными свойствами money, documents и accessories

С его помощью создаем экземпляр myCase

При создании экземпляра передаем ему ключевую фразу для доступа к содержимому сумочки 'it is me'

Поскольку свойства money, documents и accessories приватные, "сумка закрыта"

Посторонним нет доступа к ее содержимому

Публичное свойство content изначально имеет значение null

Это все, что вы можете увидеть в закрытой сумке

Если хозяин сумки согласится показать ее содержимое, то оно будет помещено в публичное свойство content для обозрения

Функция getMoney () доступа к деньгам ( приватному свойству money ) также является приватной, поскольку никто, кроме хозяина, не должен иметь возможность взять деньги из сумки

И есть два публичных метода:

  1. payment ( sum, key ) - оплата
  2. 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){
2
3}
4var books = []
5books [0] = new LibraryBook ( "Война и мир", "1995", "Лев Толстой" )
6books [1] = new LibraryBook ( "Отцы и дети", "1998", "Тургенев" )
7books [3] = new LibraryBook ( "Кобзарь", "2005", "Тарас Шевченко" )
8
9console.log ( books )
Hello