使用IIFE更新对象内部的私有变量

时间:2019-04-23 17:26:25

标签: javascript iife

对象“人”具有私有变量“名称” 。不能使用对象引用直接更新此私有变量。

使用IIFE解决此问题。 IIFE将分别返回“名称”变量,“获取”和“更新”方法以分别获取和更新名称。

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'

为什么这样的行为?

这里是the link!到工作代码。

1 个答案:

答案 0 :(得分:1)

nameperson.name不同或相等。当执行Object.defineProperties并返回obj时,您正在将person.name的默认值设置为name。但是,当您调用person.update时,您正在更改变量name。您没有更改对象密钥person.name。如果要更改person.name,则需要更改modifyName方法。

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