Обновление приватной переменной внутри объекта с использованием IIFE - PullRequest
0 голосов
/ 23 апреля 2019

Объект person 'имеет закрытую переменную' name '. Эта закрытая переменная не может быть обновлена ​​напрямую, используя ссылку на объект.

Использовал IIFE для решения этой проблемы. IIFE вернет переменную name, методы get и update для получения имени и его обновления соответственно.

const person = (function () {
  let name;
  var obj = {};

  init();

  function init() {
    name = 'dravid';
  }

  function getName() {
    return name;
  }

  function modifyName(newName) {
    name = newName;
  }

  Object.defineProperties(obj, {
    'name': {
      value: name,
      writable: false
    },
    'get': {
      value: getName,
      writable: false
    },
    'update': {
      value: modifyName,
      writable: false
    }
  });
  return obj;
})();

Давайте посмотрим ниже, что делает этот код.

person.name // returns 'dravid'
person.name = 'dhoni'
person.name // still returns 'dravid'

Теперь, еще немного ...

person.get() // returns 'dravid'
person.update('dhoni')
person.get() // returns 'dhoni'

Выше приведено довольно много информации, за исключением путаницы.

person.name // still returns 'dravid' instead of 'dhoni'

Почему такое поведение?

Вот ссылка ! к рабочему коду.

1 Ответ

1 голос
/ 23 апреля 2019

Значения name и person.name не являются одинаковыми или равными.Когда вы выполняете Object.defineProperties и возвращаете obj, вы устанавливаете значение по умолчанию person.name, равное имени.Но когда вы вызываете person.update, вы меняете переменную name.Вы НЕ меняете ключ объекта person.name.Если вы хотите изменить person.name, вам нужно изменить метод modifyName.

function modifyName(newName) {
   obj.name = newName;
}
...