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 )
Имена свойств и методов внутри "капсулы" принадлежат к пространству имен объекта
Мы агрегировали под одним именем ( именем объекта ) всю совокупность переменных и функций, определяющих и изменяющих его ( объекта ) состояние