作者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