Изменение свойств объекта. Как такое реализовать?
Написать функцию, которая принимает на вход 2 строковых аргумента: Имя и Фамилия. Функция должна вернуть объект, который будет характеризовать бейджик сотрудника.
Бейджик состоит из Зх свойств:
- firstName - имя сотрудника,
- lastName - фамилия сотрудника,
- fullName - полное имя сотрудника, в формате Фамилия + пробел + Имя.
Эти свойства должны быть доступны для чтения и редактирования:
- Если изменяются firstName или lastName, то fullName также должно быть изменено.
- Если изменяется fullName, то firstName и lastName также должны быть изменены.
Если полное имя указано в недопустимом формате, то никакие свойства > не должны измениться.
Я хочу создать такую функцию, как мне её реализовать? Я пробовал через геттеры/сеттеры, но у меня не вышло
Мой код:
function(firstName, lastName) {
const badge = {}
Object.defineProperties(badge, {
firstName: {
value: firstName,
enumerable: true,
writable: true
},
lastName: {
value: lastName,
enumerable: true,
writable: true
},
fullName: {
get: function() {
return this.firstName + ' ' + this.lastName;
},
set: function(value) {
const split = value.split(' ');
this.firstName = split[0];
this.lastName = split[1];
},
enumerable: true,
}
});
return badge;
}
Ответы (1 шт):
Автор решения: midnightelf18
→ Ссылка
такое можно сделать с помощью обертки Proxy который может перехватывать изменения для свойств fistname и latname и присваивать их fullname
function getBadge(firstname, lastname) {
const target = {
firstname,
lastname,
fullname: `${firstname} ${lastname}`,
}
const handler = {
set(target, property, value, receiver) {
if (property === "firstname" || property === "lastname") {
target[property] = value
target.fullname = `${target.firstname} ${target.lastname}`
}
return true
}
}
return new Proxy(target, handler)
}
const badge = getBadge("foo", "baz")
console.log(badge)
badge.firstname = "bar"
console.log(badge)