-
1. В классическом объектно-ориентированном программировании относятся к так называемым
"магическим методам"
-
2. В JS могут геттеры и сеттеры использоваться, как в обычных об-тах, так и в ф-ции -
конструкторе (классе)
-
3. get связывает свойство объекта с функцией, которая будет вызываться при
ОБРАЩЕНИИ к этому свойству
Листинг 1. Примеры установки геттера
var obj1 = {
get someProp(){
console.log('someProp code')
}
}
obj1.someProp;
var obj2 = {
get a() {
return 2;
}
};
obj2.a = 3;
obj2.a;
const obj3 = {
log: ['a', 'b', 'c'],
get latest() {
if (this.log.length === 0) {
return undefined;
}
return this.log[this.log.length - 1];
}
};
console.log(obj3.latest);
-
4. set связывает свойство объекта с функцией, которая
будет вызвана при попытке УСТАНОВИТЬ это свойство.
Листинг 2. Установка сеттера
var obj = {
get a() {
return this._a_;
},
set a(val) {
this._a_ = val * 2;
}
};
obj.a = 2;
obj.a;
const obj2 = {
get price(){
return this._price
},
set price(v){
this._price = `$ ${v}`
}
}
obj2.price = 200
obj2.price
var obj3 = {
set current(str) {
this.log[this.log.length] = str;
},
log: []
}
obj3.current = 2
obj3.current = 'ok'
console.log(obj3.log);
-
5. Установка геттера и сеттера с помощью дескриптора свойств в ф-ции - конструкторе.
С помощью дескриптора св-в, сеттер и геттер можно установить более детально
Установка сеттера и геттера с помощью дескриптора св-в возможна
также и в простых об-тах
Листинг 3. Установка геттера и сеттера в ф-ции - конструкторе с помощью дескрипторов доступа
function Product(){
this.price
Object.defineProperty(this,'price',{
get(){
return this._price
},
set(value){
this._price = `$ ${value}`
}
})
}
const product1 = new Product()
product1.price = 200
console.log( product1.price )
-
6. Установка геттера и сеттера в классах, рассматривается в соответсвующем разделе
Выводы по главе
1. get вызывается при обращении к св-ву
2. set вызывается при присвоении значения св-ву
3. get и set можно установить через дескрипторы св-в
Упражнения
1. Создать об-т со св-вами firstName и lastName. Создать геттер, который будет выводить полное имя при обращении к св-ву fullName
2. Создать об-т со св-вами firstName и lastName. Создать геттер, который будет выводить полное имя при обращении к св-ву fullName и сеттер, который при попытке изменить св-во fullName будет вывод в консоль сообщение 'Изменение свойства fullName напрямую запрещено'