使用函数的私有函数创建对象

时间:2017-03-13 17:05:49

标签: javascript javascript-objects

我遇到了一个片段,我怀疑它是否能以直截了当的方式编写。有人可以告诉我下面两个片段之间有什么区别:

var printer = (function () {
  var printerInstance;
  var obj = {
     f1: function() {},
     f2: function() {}
  };
  return {
     getInstance: function() {
       if(!printerInstance) {
         printerInstance = obj;
       }
       return printerInstance;
     }
   };
})();

var printer = (function () {
     var printerInstance;
     function create() {
       function f1() {}
       function f2() {}
       return {
          f1: f1,
          f2: f2
       }
     }

     return {
       getInstance: function() {
         if(!printerInstance) {
           printerInstance = create();
         }
         return printerInstance;
       }
     };
})();

我不明白为什么在第二个例子中的函数内部创建了对象。请澄清。

1 个答案:

答案 0 :(得分:1)

嗯,第一个对所有呼叫都有一个名为obj的对象,第二个为每个呼叫创建一个新对象。

例如说它是:

var obj = {
   var counter = 0;
   f1: function() { return counter++; },
   f2: function() {}
};

,第二个是:

function create() {
  var counter = 0;
  function f1() { return counter++; }
  function f2() {}
  return {
     f1: f1,
     f2: f2
  }
}

在第一种情况下,有一个counter的对象将被所有getInstance个调用引用(其中printerInstance等于null)。所以这更像是Singleton

在第二种情况下,getInstance的每次调用都会拥有自己的计数器,并且会独立计数。