考虑这个简单的JavaScript模块模式:
var human = (function () {
var _name = '';
return {
name: _name,
setName: function (name) {
_name = name;
}
}
})();
human.setName('somebody');
alert(human.name); // shows an empty string
human = (function () {
var _name = '';
return {
name: function() {
return _name;
},
setName: function (name) {
_name = name;
}
}
})();
human.setName('somebody');
alert(human.name()); // shows 'somebody'
为什么第二个闭包工作正常,而第一个闭合不起作用?请参见示例here。
另请参阅this fiddle,这证明可以使用简单属性代替getter函数。
答案 0 :(得分:8)
在Javascript中
由于名称是字符串name: _name
,因此会存储_name
的当前值,而不是_name
的引用。
setName
将仅修改_name
。
getName
将访问包含当前值的_name
。
.name
将访问初始化期间设置的复制值(name: _name
)。
答案 1 :(得分:1)
试试这个:
var human = (function () {
var _name = '';
var returnObj = {};
returnObj.name = _name;
returnObj.setName = function (name) {
_name = name;
returnObj.name = name;
};
return returnObj;
})();
human.setName('somebody');
alert(human.name);
您的代码存在的问题是setName
正在为_name
变量赋值,并且您可以访问返回对象的name
属性。