0

如何修复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
}());

但不知何故我不喜欢它。你会怎么做,在私有函数之间共享状态信息?

4

2 回答 2

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 将是未定义的...

于 2012-10-21T13:19:44.530 回答
0

在外部函数中删除this和声明bar将是最轻量级的解决方案:但是您使用内部data对象的解决方案更加灵活(尽管您应该更新您的 getter 以执行类似的操作return data.foo;)。

使用该data对象的主要优点是,如果您正在构建一个 JavaScript 代码库,您将能够在您正在创建的对象的构造函数/私有范围内调用外部函数/mixin,同时仍然以定义的接口。作为一个人为的例子,如果您正在执行诸如创建对象的 Adapter 样式之类的事情,您将能够调用类似的东西linkWithWebService(data),它可以在构造时填充并向您的私有范围成员添加行为(并且这些调用将具有类似于嵌套的直接访问其他语言中的类),但所有未来的行为仍将受到您定义的 API 的限制。

或者根据个人经验,我创建了一个 API,其中访问器遵循 getter:attributeName()和 setter:的模式attributeName(newValue),我通过创建一个高阶函数来创建 getter 和一个内部data对象来实现它。然后在构造函数返回中我做了类似的事情,attributeName = makeAccessor(attributeName, data)所以创建的函数成为属性的唯一暴露。

于 2012-10-21T13:31:22.123 回答