public and private properties - garevna/js-course GitHub Wiki

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

Конструктор - это функция, из чего следует, что с помощью конструктора можно "спрятать" переменные и функции

где спрятать?

в экземпляре, созданном с помощью этого конструктора

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

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

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

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

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

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

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

Они не отображаются в консоли при выводе объекта

:coffee:

var  Girl = function ( name, age ) {

    var defaultName = "Jane"

    this.name = name || defaultName
    this.age = age || 25

    function showName ( name ) {
        console.log ( `Меня зовут ${ name }` )
    }

    this.changeName = function ( newName ) {
        this.name = newName
        showName ( this.name )
    }
}

var lena = new Girl ( "Лена", 18 )
lena.changeName

В этом примере defaultName и showName являются приватными свойствами экземпляра lena

name, age и changeName являются публичными свойствами экземпляра lena

В публичных методах экземпляра ( changeName ) this будет ссылкой на экземпляр ( lena )

:warning: в приватных методах ( showName ) экземпляра контекстом вызова будет глобальный объект window

( т.е. внутри метода showName this будет ссылкой на объект window )

:coffee:

var girls = []

girls [ 0 ] = new Girl ( "Лена", 18 )
girls [ 1 ] = new Girl ( "Марина", 20 )

:coffee: 2

var Bag = function ( keyword ) {
   var money = 3000
   //var keyword = key
   var documents = [
       "Паспорт",
       "Водительские права",
       "Диплом ВУЗа"
   ]
   var accessories = [
       "Ключи",
       "Билеты в кино",
       "Лекарство"
   ]
   this.content = null
   function getMoney ( sum ) {
       money -= sum
   }
   this.payment = function ( sum ) {
       if ( prompt ( "ты кто?" ) !== keyword ) return "⛔️"
       getMoney ( sum )
       console.info ( 
          `Осталось денег в кошельке:
           ${money} грн` 
       )
       return `Уплачено: ${sum} грн`
   }

   this.rummage = function () {
       this.content = [
           documents,
           accessories,
           money
       ]
       console.log ( 
          `Протокол обыска.
           Содержимое сумочки:
           ${ this.content }`
       )
   }
}

var myCase = new Bag ( 'это я, твоя хозяйка' )

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

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

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

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

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

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

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

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

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

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

payment ( sum, key ) - оплата
rummage () - таможенный досмотр

В случае совершения платежа с помощью публичного метода payment

console.log ( myCase.payment ( 2000 ) )

запрашивается ключевая фраза, сверяется с установленной при создании экземпляра, и если значения совпали, то вызывается приватный метод getMoney, который уменьшает приватное свойство money на сумму платежа, после чего публичный метод pay () с чистой совестью возвращает изъятую сумму

Если будет введена неправильная ключевая фраза, то запрос будет отклонен с возвратом "⛔️"

В случае таможенного досмотра вызывается публичный метод rummage ()

myCase.rummage ()

который "выкладывает на обозрение" содержимое сумочки ( помещает его в публичное свойство content )

Теперь работники таможни могут посмотреть содержимое:

console.log ( myCase.content )

Таким образом, приватные и публичные свойства и методы помещаются в "капсулу" - объект ( экземпляр )

Это и есть инкапсуляция ( encapsultion )

Имена свойств и методов внутри "капсулы" принадлежат к пространству имен объекта

Мы агрегировали под одним именем ( именем объекта ) всю совокупность переменных и функций, определяющих и изменяющих его ( объекта ) состояние