ITPub博客

首页 > 应用开发 > > 这种方法是不是工厂模式?创造出的两个实例,为什么改变 Counter1 不会影响

这种方法是不是工厂模式?创造出的两个实例,为什么改变 Counter1 不会影响

作者:dav2100 时间:2019-08-12 13:59:09 0 删除 编辑
var makeCounter = function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }  
};

var Counter1 = makeCounter();
var Counter2 = makeCounter();
console.log(Counter1.value()); /* logs 0 */
Counter1.increment();
Counter1.increment();
console.log(Counter1.value()); /* logs 2 */

console.log(Counter2.value()); /* logs 0 */

问题的背景:我是初学小白,接触了作用域,作用域链,原型,继承,还有一点点闭包的知识。这段计时器代码是我在看这个链接中 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures 学习闭包知识遇见的。我觉得上面的代码类似于《JS高阶程序设计》中用工厂模式创建对象的方法。不知道这么理解对不对。

最重要的疑惑就是,var Counter1 = makeCounter(); 在执行以后,makeCounter() 是一个函数,执行完以后会返回函数,那么 Counter1 里面存储的是指向返回这个函数的指针。同理,Counter2 里面也是返回的这个函数的指针。也就是,Counter1 和 Counter2 保存的是同一个函数的指针。那么,为什么通过 Counter1 改变了这个函数的 value 值,Counter2 的 value 值不会受到影响呢?

谢谢各位前辈解答~

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4479/viewspace-3132816/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-10-17

  • 博文量
    176
  • 访问量
    17570