对象“人”具有私有变量“名称” 。不能使用对象引用直接更新此私有变量。
使用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!到工作代码。
答案 0 :(得分:1)
值name
和person.name
不同或相等。当执行Object.defineProperties
并返回obj
时,您正在将person.name
的默认值设置为name。但是,当您调用person.update
时,您正在更改变量name
。您没有更改对象密钥person.name
。如果要更改person.name
,则需要更改modifyName
方法。
function modifyName(newName) {
obj.name = newName;
}