Javascript 我可以使用显示模块模式对闭包中的变量使用getter/setter吗?

Javascript 我可以使用显示模块模式对闭包中的变量使用getter/setter吗?,javascript,revealing-module-pattern,Javascript,Revealing Module Pattern,我认为我可以使用setter来更改闭包变量,但是当我直接访问变量时,它是不变的。只有当我使用getter访问它时,我才能得到预期的重新分配变量。是否在不同的范围内创建了第二个变量?这里发生了什么 var obj = (function () { var name = "one"; var setName = function(strName) { name = strName; }; var getName = function() { return name;

我认为我可以使用setter来更改闭包变量,但是当我直接访问变量时,它是不变的。只有当我使用getter访问它时,我才能得到预期的重新分配变量。是否在不同的范围内创建了第二个变量?这里发生了什么

var obj = (function () {
  var name = "one";
  var setName = function(strName) {
    name = strName;
  };
  var getName = function() {
    return name;
  };

  return {
    name: name,
    setName: setName,
    getName: getName
  };
}());

obj.setName("two");

alert("obj.name is: " + obj.name); // Prints "one", but why not "two"?
alert("obj.getName() is: " + obj.getName()); // Prints "two" as I'd expect.

我已将上面的示例添加到

中,在本例中,您将在对象中存储对闭包属性的引用


重写闭包变量的值时,对象属性仍将引用旧对象。

在这种情况下,您将在对象中存储对闭包属性的引用

return {
    name: name,
    setName: setName,
    getName: getName
  };
重写闭包变量的值时,对象属性仍将引用旧对象

return {
    name: name,
    setName: setName,
    getName: getName
  };
上面的对象是在更新变量之前创建的,因此它将具有旧值

上述对象是在您更新变量之前创建的,因此它将具有旧值,您可以使用该值来完成您尝试执行的操作:

var obj=函数(){
var name=“一”;
var setName=函数(strName){
名称=strName;
};
var getName=function(){
返回名称;
};
var结果={
setName:setName,
getName:getName
};
defineProperty(结果,'name',{get:getName});
返回结果;
}();
对象集合名(“两个”);
警报(“obj.name为:“+obj.name”);//二
警报(“obj.getName()为:”+obj.getName());//二
以下是更新后的JSFIDLE:

您可以使用它来完成您想要做的事情:

var obj=函数(){
var name=“一”;
var setName=函数(strName){
名称=strName;
};
var getName=function(){
返回名称;
};
var结果={
setName:setName,
getName:getName
};
defineProperty(结果,'name',{get:getName});
返回结果;
}();
对象集合名(“两个”);
警报(“obj.name为:“+obj.name”);//二
警报(“obj.getName()为:”+obj.getName());//二

下面是更新后的JSFIDLE:

您可能要寻找的逻辑是:

var obj = function () {
    var name = "one";
    var setName = function(strName) {
        this.name = strName;
    };
    var getName = function() {
        return this.name;
    };

    return {
        name: name,
        setName: setName,
        getName: getName
    };
}();

obj.setName("two");

alert("obj.name is: " + obj.name); // one
alert("obj.getName() is: " + obj.getName()); // two
this
(在
this.name
中)所代表的内容可能具有误导性

调用方法
obj.setName()
时,
this.name
表示返回对象中的name属性,而不是顶部的第一个
name
变量


关键字信息:

您可能要查找的逻辑是:

var obj = function () {
    var name = "one";
    var setName = function(strName) {
        this.name = strName;
    };
    var getName = function() {
        return this.name;
    };

    return {
        name: name,
        setName: setName,
        getName: getName
    };
}();

obj.setName("two");

alert("obj.name is: " + obj.name); // one
alert("obj.getName() is: " + obj.getName()); // two
this
(在
this.name
中)所代表的内容可能具有误导性

调用方法
obj.setName()
时,
this.name
表示返回对象中的name属性,而不是顶部的第一个
name
变量

关键字信息:

在您的代码中:

var obj = function () {
  var name = "one";
此名称是局部变量对象的属性。这是setName和getName引用的。它在范围链上解决

  return {
    name: name,
此名称是返回对象的一个属性,即它是一个不同的“名称”,并使用对象属性标识解析(即,它与解析范围链上的标识符完全不同)进行解析。上面的行指定了局部变量名的当前值,这里没有闭包

setName和getName正在设置闭合变量,obj.name不会被这些函数修改。

在代码中:

var obj = function () {
  var name = "one";
此名称是局部变量对象的属性。这是setName和getName引用的。它在范围链上解决

  return {
    name: name,
此名称是返回对象的一个属性,即它是一个不同的“名称”,并使用对象属性标识解析(即,它与解析范围链上的标识符完全不同)进行解析。上面的行指定了局部变量名的当前值,这里没有闭包


setName和getName正在设置闭合变量,obj.name不被这些函数修改。

请在IIFE中包含括号,以便在我到达最后一行代码之前,它显然是IIFE!!(即,
var obj=(function(){…}());
Fixed just for your:)请在IIFE中包含括号,以便在我到达最后一行代码之前,它显然是IIFE!!(例如,
var obj=(function(){…}());
Fixed just for your:)因此,如果我理解正确,我将返回一个带有本地名称变量副本的对象,而不是对它的引用。因此,如果我理解正确,我将返回一个带有本地名称变量副本的对象,而不是对它的引用。