【问题标题】:Updating a private variable inside an object using IIFE使用 IIFE 更新对象内的私有变量
【发布时间】:2019-04-23 17:26:25
【问题描述】:

对象“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'

为什么会有这样的行为?

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

【问题讨论】:

  • 'name': {value: name} 好吧,反正你认为它是 value
  • writable: true 当且仅当与属性关联的值可以通过赋值运算符进行更改。
  • @Andreas 这也行不通

标签: javascript iife


【解决方案1】:

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

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

【讨论】:

  • function getName() { return obj.name; } 函数 modifyName(newName) { obj.name = newName; } 也使 name true 可写。
猜你喜欢
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
相关资源
最近更新 更多