工厂职能如何将事物私有化?

时间:2016-06-24 19:20:09

标签: javascript

如果我们有像下面那样的工厂功能。为什么内部变量bark是私有的?

  var dog = function(){
      var bark = "Woof"        //What makes this private?
      return {
        talk: function(){
          console.log(bark)
        }
      }
    }
    var fido = dog()   
    fido.bark = "BARK BARK"    //Why does this not change the bark inside the function? 
    fido.talk()

3 个答案:

答案 0 :(得分:2)

由于返回的对象没有该属性,因此无法访问工厂函数返回的对象的bark属性。让我解释一下。

考虑工厂功能的这个小变化。我已将该退货声明分解为两个陈述。

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

现在,仔细查看return语句之前的var dog = function(){ var bark = "Woof"; var returnObject = { talk: function(){ console.log(bark) } }; return returnObject; } 变量。它没有returnObject属性。只是一个谈话方法。请记住,这是最后返回的对象,因此在此返回的对象上访问或编辑bark属性不会对内部树皮值产生影响。

您可能想知道bark方法如何访问内部树皮变量。由于JavaScript中称为“闭包”的概念,talk方法可以访问内部talk变量。你应该阅读更多内容。在stackoverflow上,关于闭包的优秀资源是this answer

答案 1 :(得分:1)

这里的关键思想是当函数引用外部作用域中的变量时 - 例如在这种情况下,talk函数引用来自外部作用域的bark变量 - &# 39; s称为封闭。

变量由函数本身保存,并且通过语言设计,不能由外部世界直接访问&#34;。如果您选择公开它,它只能被外界访问,例如作为函数返回值的一部分。

如果您想要一个可以更改bark的版本,则必须执行以下操作:

var dog = function(){
  var theDog = {
    bark: "bark",
    talk: function() {
      console.log(this.bark);
    }
  };
  return theDog;
}
var fido = dog()   
fido.bark = "BARK BARK"    //Why does this not change the bark inside the function? 
fido.talk()

(一个更惯用的版本可能会使用Dog构造函数,但我试图尽可能接近原始代码)

MDN article on closures非常适合关于闭包的更多信息。

答案 2 :(得分:0)

函数中可用的变量bark.to使其公开,有必要将其分配给它。

var dog = function(){
      this.bark = "Woof"
      return {
        talk: function(){
          console.log(this.bark)
        }
      }
    }
    var fido = dog()   
    fido.bark = "BARK BARK"
    fido.talk()

或通过构造函数传输他的数据

var dog = function(data){
      if(!data) data = 'Woof';
      var bark = data;
......
......