看板 Ajax 關於我們 聯絡資訊
最近寫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)
mrbigmouth:要設私有變數不就是不要給外部存取嗎? 02/22 16:31
mrbigmouth:幹嘛又設成私有變數又設一堆getter/setter? 02/22 16:31
mrbigmouth:(所以這個變數到底要不要給外部存取啊???) 02/22 16:31
mrbigmouth:還是回答一下問題好了....如果你想弄一個不給外界存但 02/22 16:33
mrbigmouth:能方便取用的變數...目前JS常見的作法的做法是在前方加 02/22 16:34
mrbigmouth:__底線以表示"拜托大家不要改這裡否則我就當機給你看" 02/22 16:34
mrbigmouth:在ECMAScript5 可以用writable去控制某物件屬性可不可 02/22 16:35
mrbigmouth:寫...也能直接定義getter跟setter 02/22 16:36
popcorny:http://goo.gl/aWrZ6 02/22 16:50
BBSealion:設getter和setter是因為"只能這樣來"仿造"私有變數的 02/22 16:53
BBSealion:效果,我查的到的是這樣啦 但也覺得很怪 所以上來問問看 02/22 16:53
BBSealion:不這樣做的話自己的method也叫不到他們了ORZ 02/22 17:02
lausai:推用底線+註解的方式宣告私有變數 用 nested function 很浪 02/22 17:11
lausai:費記憶體 因為你的 Class 每 new 出來一次那些 nested 02/22 17:11
lausai:function 就會多出一份實體 02/22 17:12
mrbigmouth:你絕對是誤會了什麼...私有變數就是不給人讀也不給人改 02/22 17:13
mrbigmouth:getter跟setter是提供外部合法進行存取的途徑 而非必要 02/22 17:14
mrbigmouth:比方說你可以只設getter不設setter所以外部就只能讀 02/22 17:15
mrbigmouth:也可以設setter但在其中設定檢查函式讓"只有合法的資料 02/22 17:15
mrbigmouth:"能進入私有變數 02/22 17:15
mrbigmouth:總而言之 你要在js用私有變數用var就好了 02/22 17:15
mrbigmouth:setter跟getter都不是必要的 只有某些時候會用到 02/22 17:16
mrbigmouth:硬要做私有變數又要弄getter/setter 所有語言都差不多 02/22 17:17
mrbigmouth:一樣麻煩 02/22 17:17
mrbigmouth:雖然有很多能讓語法變簡潔的lib/套件啦 02/22 17:18
BBSealion:to mrb大 可能我沒有描述清楚我的問題,我回文一篇我看 02/22 17:30
BBSealion:到的狀況 02/22 17:30
BBSealion:底線倒是個很簡單的做法XD 我可以試試看 雖然有點不舒服 02/22 17:31
BBSealion:話說單底線和雙底線,在js有很大的差別嗎 02/22 17:43
TonyQ:我直接講結論,在 JS 去追求真正外部不能 access 的 private 02/24 00:20
TonyQ:其實很多餘。另外底線什麼的只是 naming convention 沒有 02/24 00:20
TonyQ:實質效益。 02/24 00:20
TonyQ:另外 getter/setter 要不要作,取決於這個 properites 你 02/24 00:20
TonyQ:怎麼用,我不覺得一定要寫,但是也不覺得寫了一定多餘。 02/24 00:20
matrixki:getter setter寫不寫真的是看需不需要 即使不需要寫了 02/24 17:55
matrixki:debug也會用到 所以不致於多餘 02/24 17:55