175 lines
5.7 KiB
Markdown
175 lines
5.7 KiB
Markdown
![]() |
---
|
|||
|
id: 587d7b8c367417b2b2512b54
|
|||
|
title: Використовуйте ґетери й сетери для Управління доступом до об'єкта
|
|||
|
challengeType: 1
|
|||
|
forumTopicId: 301220
|
|||
|
dashedName: use-getters-and-setters-to-control-access-to-an-object
|
|||
|
---
|
|||
|
|
|||
|
# --description--
|
|||
|
|
|||
|
Ви можете отримати значення від об'єкта й встановити значення властивості без об'єкта.
|
|||
|
|
|||
|
Це має назву <dfn>getters</dfn> й <dfn>setters</dfn>.
|
|||
|
|
|||
|
Функції ґетерів призначені для повернення (або отримання) значення приватної змінної без користувача, що безпосередньо має доступ до приватної змінної.
|
|||
|
|
|||
|
Функції сетерів призначені для змінення (або встановлення) значення приватної змінної об'єкту, що надалі використовується в функції сетерів. У складі цієї змінної може бути обчислення або навіть перезаписування попереднього значення.
|
|||
|
|
|||
|
```js
|
|||
|
class Book {
|
|||
|
constructor(author) {
|
|||
|
this._author = author;
|
|||
|
}
|
|||
|
// getter
|
|||
|
get writer() {
|
|||
|
return this._author;
|
|||
|
}
|
|||
|
// setter
|
|||
|
set writer(updatedAuthor) {
|
|||
|
this._author = updatedAuthor;
|
|||
|
}
|
|||
|
}
|
|||
|
const novel = new Book('anonymous');
|
|||
|
console.log(novel.writer);
|
|||
|
novel.writer = 'newAuthor';
|
|||
|
console.log(novel.writer);
|
|||
|
```
|
|||
|
|
|||
|
Ця консоль буде зображати рядки `anonymous` й `newAuthor`.
|
|||
|
|
|||
|
Зверніть увагу на синтаксис, що використовується для виклику ґетерів й сетерів. Вони навіть не схожі на функції. Ґетери і сетери мають велике значення, бо вони приховують внутрішні деталі реалізації.
|
|||
|
|
|||
|
**Примітка:** Важливо використовувати підкреслювання (`_`) перед назвою приватної змінної. Однак сама практика не створює приватні змінні.
|
|||
|
|
|||
|
# --instructions--
|
|||
|
|
|||
|
Використовуйте `class` ключове слово для створення `Thermostat` класу. Конструктор `constructor` припускає температуру Фаренгейту.
|
|||
|
|
|||
|
На занятті створіть `getter` для отримання температури Цельсія й `setter` для її встановлення.
|
|||
|
|
|||
|
Пам'ятайте, що `C = 5/9 * (F - 32)` й`F = C * 9.0 / 5 + 32`, де `F` це значення температури за Фаренгейтом, а `C` значення тієї ж самої температури, але за Цельсієм.
|
|||
|
|
|||
|
**Примітка:** Під час виконання ви можете дослідити температуру в класі за Фаренгейтом або за Цельсієм.
|
|||
|
|
|||
|
У цьому сила ґетерів й сетерів. Ви створюєте API для іншого користувача, що може отримати правильний результат, незалежно від того, що саме ви досліджуєте.
|
|||
|
|
|||
|
Інакше кажучи, ви приховуєте деталі реалізації від користувача.
|
|||
|
|
|||
|
# --hints--
|
|||
|
|
|||
|
`Thermostat` має бути `class` визначеним за допомогою `constructor`.
|
|||
|
|
|||
|
```js
|
|||
|
assert(
|
|||
|
typeof Thermostat === 'function' &&
|
|||
|
typeof Thermostat.constructor === 'function'
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
Використовуйте ключове слово `class`.
|
|||
|
|
|||
|
```js
|
|||
|
assert(code.match(/class/g));
|
|||
|
```
|
|||
|
|
|||
|
Має бути встановлено `Thermostat`.
|
|||
|
|
|||
|
```js
|
|||
|
assert(
|
|||
|
(() => {
|
|||
|
const t = new Thermostat(122);
|
|||
|
return typeof t === 'object';
|
|||
|
})()
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
Після встановлення змінної за Фаренгейтом `Thermostat` має встановити правильну `temperature`.
|
|||
|
|
|||
|
```js
|
|||
|
assert(
|
|||
|
(() => {
|
|||
|
const t = new Thermostat(122);
|
|||
|
return t.temperature === 50;
|
|||
|
})()
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
`getter` має бути визначеним.
|
|||
|
|
|||
|
```js
|
|||
|
assert(
|
|||
|
(() => {
|
|||
|
const desc = Object.getOwnPropertyDescriptor(
|
|||
|
Thermostat.prototype,
|
|||
|
'temperature'
|
|||
|
);
|
|||
|
return !!desc && typeof desc.get === 'function';
|
|||
|
})()
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
`setter` має бути визначеним.
|
|||
|
|
|||
|
```js
|
|||
|
assert(
|
|||
|
(() => {
|
|||
|
const desc = Object.getOwnPropertyDescriptor(
|
|||
|
Thermostat.prototype,
|
|||
|
'temperature'
|
|||
|
);
|
|||
|
return !!desc && typeof desc.set === 'function';
|
|||
|
})()
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
Виклик `setter` зі значенням за Цельсієм має встановити `temperature`.
|
|||
|
|
|||
|
```js
|
|||
|
assert(
|
|||
|
(() => {
|
|||
|
const t = new Thermostat(32);
|
|||
|
t.temperature = 26;
|
|||
|
const u = new Thermostat(32);
|
|||
|
u.temperature = 50;
|
|||
|
return t.temperature === 26 && u.temperature === 50;
|
|||
|
})()
|
|||
|
);
|
|||
|
```
|
|||
|
|
|||
|
# --seed--
|
|||
|
|
|||
|
## --seed-contents--
|
|||
|
|
|||
|
```js
|
|||
|
// Only change code below this line
|
|||
|
|
|||
|
// Only change code above this line
|
|||
|
|
|||
|
const thermos = new Thermostat(76); // Setting in Fahrenheit scale
|
|||
|
let temp = thermos.temperature; // 24.44 in Celsius
|
|||
|
thermos.temperature = 26;
|
|||
|
temp = thermos.temperature; // 26 in Celsius
|
|||
|
```
|
|||
|
|
|||
|
# --solutions--
|
|||
|
|
|||
|
```js
|
|||
|
class Thermostat {
|
|||
|
constructor(fahrenheit) {
|
|||
|
this._tempInCelsius = 5/9 * (fahrenheit - 32);
|
|||
|
}
|
|||
|
get temperature(){
|
|||
|
return this._tempInCelsius;
|
|||
|
}
|
|||
|
set temperature(newTemp){
|
|||
|
this._tempInCelsius = newTemp;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
const thermos = new Thermostat(76); // Setting in Fahrenheit scale
|
|||
|
let temp = thermos.temperature; // 24.44 in Celsius
|
|||
|
thermos.temperature = 26;
|
|||
|
temp = thermos.temperature; // 26 in Celsius
|
|||
|
```
|