作者BBSealion (海狮)
看板Ajax
标题[问题] javascript 的 private 属性
时间Fri Feb 22 16:23:46 2013
最近写javascript碰到一个问题
我想在Class里面宣告很多private变数
但是我查阅了一下javascript似乎没有这种属性
只有一种方法制造看似private的变数
就是把变数宣告在里面如下:
Class(){
var a
this.getA = function(){ return a };
this.setA = function(myA){ a = myA };
}
但我有非常多的private变数
所以我就得在宣告里面宣告一堆getter和setter
宣告的code看起来瞬间变两倍,感觉有够丑的
而且在自己的method中还是得用 sth = this.getA(); 而不是 sth = this.a
感觉除了增加安全性以外,却让code很难看?
请问有人对这个问题有比较好的处理方法吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.61.45
※ 编辑: BBSealion 来自: 220.133.61.45 (02/22 16:24)
1F:推 mrbigmouth:要设私有变数不就是不要给外部存取吗? 02/22 16:31
2F:→ mrbigmouth:干嘛又设成私有变数又设一堆getter/setter? 02/22 16:31
3F:→ mrbigmouth:(所以这个变数到底要不要给外部存取啊???) 02/22 16:31
4F:→ mrbigmouth:还是回答一下问题好了....如果你想弄一个不给外界存但 02/22 16:33
5F:→ mrbigmouth:能方便取用的变数...目前JS常见的作法的做法是在前方加 02/22 16:34
6F:→ mrbigmouth:__底线以表示"拜托大家不要改这里否则我就当机给你看" 02/22 16:34
7F:→ mrbigmouth:在ECMAScript5 可以用writable去控制某物件属性可不可 02/22 16:35
8F:→ mrbigmouth:写...也能直接定义getter跟setter 02/22 16:36
10F:→ BBSealion:设getter和setter是因为"只能这样来"仿造"私有变数的 02/22 16:53
11F:→ BBSealion:效果,我查的到的是这样啦 但也觉得很怪 所以上来问问看 02/22 16:53
12F:→ BBSealion:不这样做的话自己的method也叫不到他们了ORZ 02/22 17:02
13F:推 lausai:推用底线+注解的方式宣告私有变数 用 nested function 很浪 02/22 17:11
14F:→ lausai:费记忆体 因为你的 Class 每 new 出来一次那些 nested 02/22 17:11
15F:→ lausai:function 就会多出一份实体 02/22 17:12
16F:推 mrbigmouth:你绝对是误会了什麽...私有变数就是不给人读也不给人改 02/22 17:13
17F:→ mrbigmouth:getter跟setter是提供外部合法进行存取的途径 而非必要 02/22 17:14
18F:→ mrbigmouth:比方说你可以只设getter不设setter所以外部就只能读 02/22 17:15
19F:→ mrbigmouth:也可以设setter但在其中设定检查函式让"只有合法的资料 02/22 17:15
20F:→ mrbigmouth:"能进入私有变数 02/22 17:15
21F:→ mrbigmouth:总而言之 你要在js用私有变数用var就好了 02/22 17:15
22F:→ mrbigmouth:setter跟getter都不是必要的 只有某些时候会用到 02/22 17:16
23F:→ mrbigmouth:硬要做私有变数又要弄getter/setter 所有语言都差不多 02/22 17:17
24F:→ mrbigmouth:一样麻烦 02/22 17:17
25F:→ mrbigmouth:虽然有很多能让语法变简洁的lib/套件啦 02/22 17:18
26F:→ BBSealion:to mrb大 可能我没有描述清楚我的问题,我回文一篇我看 02/22 17:30
27F:→ BBSealion:到的状况 02/22 17:30
28F:→ BBSealion:底线倒是个很简单的做法XD 我可以试试看 虽然有点不舒服 02/22 17:31
29F:→ BBSealion:话说单底线和双底线,在js有很大的差别吗 02/22 17:43
30F:→ TonyQ:我直接讲结论,在 JS 去追求真正外部不能 access 的 private 02/24 00:20
31F:→ TonyQ:其实很多余。另外底线什麽的只是 naming convention 没有 02/24 00:20
32F:→ TonyQ:实质效益。 02/24 00:20
33F:→ TonyQ:另外 getter/setter 要不要作,取决於这个 properites 你 02/24 00:20
34F:→ TonyQ:怎麽用,我不觉得一定要写,但是也不觉得写了一定多余。 02/24 00:20
35F:推 matrixki:getter setter写不写真的是看需不需要 即使不需要写了 02/24 17:55
36F:→ matrixki:debug也会用到 所以不致於多余 02/24 17:55