4

考虑这个简单的 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'

为什么第二个关闭工作正常,而第一个关闭不工作?请参见此处的示例。

另请参阅这个 fiddle,它证明可以使用简单的属性来代替 getter 函数。

4

2 回答 2

8

在 Javascript 中

  • 字符串和原始类型(布尔和数字)按值传递
  • 对象、数组和函数通过引用传递

由于 name 是一个字符串name: _name,它将存储 的当前值_name而不是对 的引用_name

setName在您的示例中将仅修改_name.

getName将访问_name保存当前值的内容。

.name将访问在初始化期间设置的复制值 ( name: _name)。

另见SO:Javascript by reference vs. by value

于 2013-02-05T12:29:15.137 回答
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返回对象的属性。

于 2013-02-05T12:29:39.190 回答