Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Как внутри объекта, динамически изменять одни его свойства, изменяя другие? Т.е. как создать зависимость?

#javascript


Логически пытался сделать как-то так, но это неправильно:

var foo = {
  lol: 5,
  kek: this.lol+3
}

alert (foo.kek);

    


Ответы

Ответ 1



С помошью геттера var foo = { lol: 5, get kek(){ return this.lol+3 } } console.log(foo.kek);

Ответ 2



Для решения этой задачи вы можете использовать функцию сеттер для свойства у которого вы хотите переопределить операцию присваивания. Ниже я привёл простой пример решения вашей задачи, так как здесь не рассмотрен вопрос инкапсуляции свойства _name - то есть запрет на изменения этого свойства напрямую human._name = '' минуя сеттер и соответственно валидацию на минимальное количество символов: let human = { _name: 'Не задано', // переменная для хранения значения свойства name name_length: 0, // переменная которую мы будем изменять при изменении свойства name set name(new_val) { if (new_val.length === 0) { // делаем валидацию // выходим из функции, после этого код функции дальше // не будет выполнятся, и присвоение неправильного значения // не произойдёт return; } // выполняем сохранение значения для текущего свойства this._name = new_val; // меняем другое свойство объекта this.name_length = new_val.length; }, get name() { // возвращаем значение свойства name return this._name; } } alert(`Имя [${human.name}], Количество символов [${human.name_length}]`); human.name = ''; // присвоение не произойдёт так как значение не валидно alert(`Имя [${human.name}], Количество символов [${human.name_length}]`); human.name = 'Алексей'; // присвоение успешно alert(`Имя [${human.name}], Количество символов [${human.name_length}]`); То есть, когда вы будете присваивать значение переменной human.name в этот момент вызовется функция в которой вы сами определяете какие операции выполнять, соответственно в этот момент вы можете присвоить значение другому свойству вашего объекта или же произвести другие операции. Подробнее о сеттерах и геттерах.

Комментариев нет:

Отправить комментарий