Все мы знаем, что в JS есть объекты, но знаем ли мы объекты?
Знаете ли вы, что есть два типа свойств объектов, которые можно найти в JS?
Первый тип — это данные📝.
Это как-то само собой разумеющееся…
console.log(obj.age)
Второе — это свойство доступа. 🔐
Есть в основном функции, которые выполняются при получении и установке значений объекта.
У них есть зарезервированные слова set и get . Давайте посмотрим на них в действии…
let person = {
get propertyName() {
// code goes here
}
set propertyName(value) {
//code goes here
}
}
То, как они работают, довольно просто, это действительно похоже на любой другой язык ООП, который мы все знаем и любим C#/JAVA/C++ … 💿
Например :
let dog = {
name: 'Marco'
favToy: 'Rubber Chicken'
}
Давайте добавим жетон….
let dog = {
name: 'Marco'
favToy: 'Rubber Chicken'
get dogTag() {
return `${this.name}`+ " loves his "+ `${this.favToy}`
}
}
console.log(dog.dogTag) // Marco loves his Rubber Chicken
Снаружи свойство-аксессор выглядит как обычное. Вот в чем идея… Это называется не функцией, а свойством.
С другой стороны, если это свойство, то давайте попробуем присвоить ему значение...
let dog = {
name: 'Marco'
favToy: 'Rubber Chicken'
get dogTag(){
return `${this.name}`+ " loves his "+ `${this.favToy}`
}
}
dog.dogTag = 'Blanko loves his blanket' // Error (property has only a getter)
Чтобы исправить это, мы должны добавить сеттердля dogTagproperty.
let dog = {
name: 'Marco'
favToy: 'Rubber Chicken'
get dogTag(){
return `${this.name}`+ " loves his "+ `${this.favToy}`
}
set dogTag(value){
[this.name, this.favToy] = value.split("loves his");
}
}
dog.dogTag = 'Blanko loves his blanket'
console.log(dog.name) // Blanko
console.log(dog.favToy) // blanket
В конце концов, у нас есть свойство, доступное для чтения и записи 💡
Мы можем сделать нечто другое, более общее, чем использование текущего экземпляра объекта и определение его свойств.
let dog={
name: 'Marco'
favToy: 'Rubber Chicken'
}
Object.defineProperty(dog, 'dogTag', {
get () {
return `${this.name}`+ " loves his "+ `${this.favToy}`
}
set (value) {
[this.name, this.favToy] = value.split('loves his');
}
console.log(dog.dogTag)// Marko loves his Rubber Chicken
Одно важное замечание о свойствах заключается в том, что мы можем определить свойство доступа get/set или свойство данных, но не то и другое одновременно.
Если мы попытаемся использовать как аксессоры, так и значения, мы получим ошибку недопустимого свойства.
Чтобы перейти к следующему шагу в методах доступа, мы можем вставить в них некоторую логику, чтобы защитить их от нежелательных значений… 🐶
