在构造函数 c 里面定义函数和在 c.prototype 里面定义有什么区别?

2014-07-24 14:17:09 +08:00
 rcmerci
比如:
>function I(){this.func=function(){return this}}
undefined
>I.prototype={func2:function(){return this}}
Object {func2: function}
>a=new I()
I {func: function, func2: function}
>a.func()
I {func: function, func2: function}
>a.func2()
I {func: function, func2: function}
----------------------------------------------------
这里的话,方法定义在I里面和prototype里会有什么区别呢?
2717 次点击
所在节点    JavaScript
9 条回复
yimity
2014-07-24 21:05:12 +08:00
定义在 i 里,new 的时候,每个实例都会有,占用内存多,放在原型里,所有实例都只用一个引用。
rcmerci
2014-07-25 14:03:16 +08:00
@yimity 也就是说,除了占内存之外别的区别没有吗?
coolicer
2014-07-26 17:27:14 +08:00
一种叫特权方法,一种叫公有方法
rcmerci
2014-07-27 16:30:48 +08:00
@coolicer 但是有什么区别呢?
coolicer
2014-07-27 20:18:45 +08:00
@rcmerci 你为什么要问不同的东西有什么区别 =。=
rcmerci
2014-07-27 20:48:45 +08:00
@coolicer 就是,方法x定义在prototype里和定义在构造函数里,a=new XX(),a.x()效果不是一样吗?
coolicer
2014-07-28 08:33:20 +08:00
@rcmerci 一楼说了,this方法是每个实例都会生成,而prototype里的方法是会共享的。
lijsh
2014-07-29 13:14:04 +08:00
假设构造函数里定义的方法是fn,这个方法在以new调用构造函数时是直接赋值在实例上的,每调用一次构造函数就生成一次新的fn,也就是说生成1000个实例就会生成1000次这个函数。

另外构造函数里定义的属性和方法是会覆盖prototype上的同名属性(方法)的。

所以楼主问题的答案是:
1:内存占用有区别,构造函数上的方法会重复调用,prototype上的方法会在实例生成时自动继承;
2:优先级有区别,构造函数上的属性(方法)会覆盖prototype上的属性(方法)。
rcmerci
2014-07-29 16:43:32 +08:00
@lijsh 太赞了,要的就是这个答案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/124277

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX