这种方法是不是工厂模式?创造出的两个实例,为什么改变 Counter1 不会影响到 Counter2?
时间: 2019-03-27来源:博客园
前景提要
这种方法是不是工厂模式?创造出的两个实例,为什么改变 Counter1 不会影响到 Counter2?
0 悬赏园豆: 50 [待解决问题] 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 值不会受到影响呢?
谢谢各位前辈解答~ JavaScript 闭包 对象 碳烤牛肉干 | 初学一级 | 园豆: 152
提问于:2019-03-27 20:01 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(5) 0 前端的不怎么会,但这个不是工厂模式,这只是在一个方法内调用方法进行算术运算然然后返回一个基本类型的值。
工厂模式是专门生产某一对象的,比如使用框架中不可缺少的session对象 就是由SqlSessionFactory生产出来的。而非简单的返回一个基本数据类型的值。 一世红尘 | 园豆:321 (菜鸟二级) | 2019-03-27 20:21 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 1.不是工厂模式,工厂模式是生产有共性但类型不同的对象, makeCounter() 返回的是同一个类型的对象。
2. Counter1 里的 privateCounter 和和 Counter2 的 privateCounter 只是名字相同,但地址是不同的,自然不会相互影响。通常一个变量的生命期受限于作用域,而闭包实际是延长了其生命期,而延长生命期的方法就只有为变量动态分配空间为不是使用原始的栈空间。
PS:我没接触过JS,不过不同语言的原理都是相通的。 一罪 | 园豆:245 (菜鸟二级) | 2019-03-28 16:31 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 本质上value函数控制的privateCounter并不是一个引用类型值,Counter1 和Counter2的privateCounter实际上是var了一个局部变量 zzhenxiang | 园豆:225 (菜鸟二级) | 2019-04-08 19:04 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 count1 count2是两个不同的闭包 虽然函数指针一样 但是操作的值有两个副本 各自操作的值不一样 陈浩-存储 | 园豆:202 (菜鸟二级) | 2019-04-08 23:07 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 makeCounter 函数是工厂函数,因为它返回一个对象。这种形式好像形成了闭包,Counter1 和 Counter2 是分别实例化的,所以 privateCounter 的值是不相干的。 zanetti | 园豆:147 (初学一级) | 2019-04-11 10:14 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行