javascript模块模式:从私有函数向模块添加私有属性

时间:2012-10-21 12:48:15

标签: javascript revealing-module-pattern

如何修复createBar()以便在与属性bar相同的级别创建私有属性foo

var x = (function() {
  var foo = "a";

  function createBar() {
    this.bar = "b";
  }

  return {
    getFoo: function() {
        return foo;
    },
    getBar: function() {
        return bar;
    }
  }; // end: returned object
}());

这是模块的工作方式:

x.getFoo(); // returns a
x.getBar(); // returns b
window.bar; // is undefined (but in my example, it is b)

更新

这就是我现在正在做的事情:

var x = (function() {
  var data = {};  //private object holding state variables
  data.foo = "a"; // one state variable

  function createBar() {
    data.bar = "b"; // another dynamically created state variable
  }

  return {
    getFoo: function() {
        return foo;
    },
    getBar: function() {
        return bar;
    }
  }; // end: returned object
}());

但不知怎的,我不喜欢它。你会做什么,在私人职能之间分享国家信息?

2 个答案:

答案 0 :(得分:1)

window.bar; // is undefined (but in my example, it is b)

调用私有方法createBar将以一个属性bar ='b'

的新对象结束

它的私有因为它无法从外部读取它的属性你可以存储一个对象引用来访问它但我不认为它是你在寻找...

通过定义另一个var,它在两个函数的范围内:

var x = (function() {
    var foo = "a";
    var bar;

    function createBar() {
        bar = "b";
    }

    return {
        getFoo: function() {
            return foo;
        },
        getBar: function() {
            return bar;
        }
    }; // end: returned object
}());

别忘了调用createBar(),否则bar将是未定义的......

答案 1 :(得分:0)

删除外部函数中的this并声明bar将是最轻量级的解决方案:但是使用内部data对象的解决方案更灵活(尽管您应该是更新你的getter来做return data.foo;)。

使用data对象的主要优点是,如果要构建JavaScript代码库,则可以在对象的构造函数/私有范围内调用外部函数/ mixins。创建,同时仍然以定义的界面结束。作为一个人为的例子,如果你正在做一些像创建一个适配器样式的对象,你可以调用像linkWithWebService(data)这样的东西,它可以填充并在构建时向你的私有范围成员添加行为(这些调用会有直接访问类似于其他语言中的嵌套类),但所有未来的行为仍将受到您定义的API的限制。

或者根据个人经验,我创建了一个API,其中访问者遵循getter模式:attributeName()和setter:attributeName(newValue)我通过创建更高阶函数来创建getter和内部{ {1}}对象。然后在构造函数返回中我执行了类似data的操作,因此创建的函数成为属性的唯一曝光。