Изменение свойств объекта. Как такое реализовать?

Написать функцию, которая принимает на вход 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)

→ Ссылка