什么时候用原型,什么时候用闭包
javascript吧
全部回复
仅看楼主
level 6
诺德★五月花
楼主
前段时间在看关于这两块的知识,发现这两种技术的作用很相似。
但是我不清楚什么场景该用前者什么时候该用后者……
2015年11月30日 03点11分
1
level 8
_moe
闭包原型你应该是弄混了,没啥关系
2015年11月30日 04点11分
2
诺德★五月花
我知道它们是不相关的东西,我只是说它们的“作用”(不是实现原理什么的)很相似
2015年11月30日 04点11分
level 7
放开小熊好吗
什么时候用原型呢?就是你需要创建一个公有的东西来实现继承!打个比方所有的动物都有“叫”这个函数 那么不可能给每个动物类加这个动物原型加就行了! 至于闭包 你首先得知道闭包是干嘛用的 闭包是私有化变量外部不能访问的 一个简单的例子 点赞点一次赞数加一!
2015年11月30日 04点11分
3
诺德★五月花
唔……继承,这部分我还没怎么看,因为工作到现在甚至连闭包、原型都没用过。“点赞”是个挺好的场景,还有更多的吗?
2015年11月30日 04点11分
放开小熊好吗
@诺德★五月花
这个。。。原型是js面向对象基础!闭包是JS的核心无处不在。我建议你好好看这些多写写类写模块写扩展函数 工程师是具有工程师化思想的你要想拿高工资这个是必要的
2015年11月30日 04点11分
放开小熊好吗
@放开小熊好吗
当然如果是从事网页设计师那就无所谓多积累写绚丽 的特效如果是前端工程师的话那么模块化业务逻辑是必须的!
2015年11月30日 04点11分
诺德★五月花
@放开小熊好吗
明白。最近几个月在公司用react + flux写内部系统,我写的最复杂的一个公共组件就是一个能匹配多个条件的支持搜索的下拉菜单。一直以来都没有遇到过任何难点。但是这两点知识我想肯定是有用的,所以最近去学了,希望下一个需求的时候能派上用场。
2015年11月30日 04点11分
level 8
_moe
其实我觉得你题目提得有问题嘛,看起来是要把这两种并列起来了。今天水了一天吧发现一个有价值的问题都没,就你这个可以讨论一下。
好了,现在说说我的看法。
原型的本质是对象利用原型链来查询所带的方法和变量,这样就算是一个空的对象,只要它有原型,那么它就具有那个原型的方法和变量。这也是相当独特的基于原型的面向对象,最早是 smalltalk 语言上实现的。优点是,灵活,省内存(因为我们只需保存一套原型,就能给无数对象使用),在创建对象时,优先考虑在原型上添加方法。
而闭包的实现实际上和原型有点像,它利用作用域链来逐层查询变量,闭包可以用于模拟 一个类中的 private 方法和变量,在 es6 还未普及之前,这是我们唯一可是实现 private 的途径。还有其它,在回调函数中闭包可以用来保存现场。
ok,以上。
2015年11月30日 10点11分
5
诺德★五月花
呃……闭包保存现场?没理解。同样的问题我在这里也提问了
http://segmentfault.com/q/1010000004067464
2015年11月30日 10点11分
_moe
@诺德★五月花
现场指的是上下文,或者确切说是当前作用域的变量什么的。还有柯里化也用到闭包。
2015年11月30日 12点11分
_moe
@诺德★五月花
新注册了个号,江小杰,答题了
2015年11月30日 12点11分
level 1
dp199313
首先你得知道js没有块级作用域,js的作用域局限在一个function内,这个作用域通常被称作执行上下文(context),在一个函数内定义的变量在外部是访问不到的,但是你可以return这个变量 的引用来让外部能访问到。这就叫做闭包。
比如
var func = function(){
var a = “hello world”;
return {
a:a
}
}
console.log(func().a);
然后你得知道 上面说的context是一个对象。
当js语句执行到一个函数内部的时候有一个全局变量 this始终指向正在执行的函数的context。
和其它语言不同的是this不是永远指向那个类的context。
this指向的永远是正在运行的function的context。
当一个函数遇到new 关键字执行的时候会新建一个context来执行函数,并返回context对象,每一个函数对象都有一个prototype对象叫做原型,函数执行的context都会链接到这个prototype对象,所以所有由这个函数和new关键字生成的context都链接了同一个prototype对象,对象在寻找属性和方法定义的时候会沿对象和原型的链向上搜寻,返回第一个匹配的属性或方法,这样所有的由那个function生成的对象就都能使用prototype上的属性和方法了。
这就形成了继承的关系。这种继承关系叫做原型链。
2015年11月30日 14点11分
6
诺德★五月花
我觉得你没理解问题,或者说我没表达清楚
2015年11月30日 15点11分
dp199313
如果我讲的够清楚你能理解了我讲的,自然就
知道这两个差了十万八千里。理解了这两个的原理才能真正知道用在什么样的场景。我现在告诉你闭包用于模块,原型链用于类和继承,你就能明白么。知识需要消化,我带了三波小弟,带小弟的经验告诉我,要告诉他们知识让他们自己用时间消化。不能直接说怎么做。
2015年11月30日 15点11分
贴吧用户_QA6PVMG
@dp199313
你先测试一下你这个玩意儿真的产生闭包了吗?我差点就信你了
2018年10月20日 00点10分
贴吧用户_QA6PVMG
@dp199313
this永远指向啥,你在说一遍
2018年10月20日 00点10分
level 9
程序猿88
作用相似??怎么相似呢?
2015年11月30日 15点11分
7
诺德★五月花
http://segmentfault.com/q/1010000004067464
看这里
2015年11月30日 15点11分
程序猿88
回复 诺德★五月花 :还是看不出哪里相似,一个能直接访问speed,一个不能直接访问吧?
2015年11月30日 15点11分
诺德★五月花
@程序猿88
除了这个呢?为了隐藏所以闭包更好原型不好?我现在需要知道的不是他们的不同点,而是什么时候该用什么技术,我不希望工作的时候为了闭包而闭包,为了原型而原型。而是需要知道为什么要这么用,为什么要那样用……
2015年11月30日 15点11分
程序猿88
@诺德★五月花
建议你去看看js的面向对象,觉得你没理解js
2015年11月30日 15点11分
level 1
顺139
我觉得根本就不一样。一个是可以添加属性和方法。一个可以从外部访问函数内部的变量。使其函数用了一次之后不被销毁
2015年11月30日 16点11分
8
level 1
贴吧用户_QA6PVMG
原型实例属于公有属性,原型实例属于私有属性,心情好就原型,心情不好就闭包
2020年05月13日 18点05分
10
1