[問題] javascript 的 private 屬性

看板Ajax作者 (海獅)時間11年前 (2013/02/22 16:23), 編輯推噓5(5031)
留言36則, 6人參與, 最新討論串1/5 (看更多)
最近寫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)

02/22 16:31, , 1F
要設私有變數不就是不要給外部存取嗎?
02/22 16:31, 1F

02/22 16:31, , 2F
幹嘛又設成私有變數又設一堆getter/setter?
02/22 16:31, 2F

02/22 16:31, , 3F
(所以這個變數到底要不要給外部存取啊???)
02/22 16:31, 3F

02/22 16:33, , 4F
還是回答一下問題好了....如果你想弄一個不給外界存但
02/22 16:33, 4F

02/22 16:34, , 5F
能方便取用的變數...目前JS常見的作法的做法是在前方加
02/22 16:34, 5F

02/22 16:34, , 6F
__底線以表示"拜托大家不要改這裡否則我就當機給你看"
02/22 16:34, 6F

02/22 16:35, , 7F
在ECMAScript5 可以用writable去控制某物件屬性可不可
02/22 16:35, 7F

02/22 16:36, , 8F
寫...也能直接定義getter跟setter
02/22 16:36, 8F

02/22 16:50, , 9F
02/22 16:50, 9F

02/22 16:53, , 10F
設getter和setter是因為"只能這樣來"仿造"私有變數的
02/22 16:53, 10F

02/22 16:53, , 11F
效果,我查的到的是這樣啦 但也覺得很怪 所以上來問問看
02/22 16:53, 11F

02/22 17:02, , 12F
不這樣做的話自己的method也叫不到他們了ORZ
02/22 17:02, 12F

02/22 17:11, , 13F
推用底線+註解的方式宣告私有變數 用 nested function 很浪
02/22 17:11, 13F

02/22 17:11, , 14F
費記憶體 因為你的 Class 每 new 出來一次那些 nested
02/22 17:11, 14F

02/22 17:12, , 15F
function 就會多出一份實體
02/22 17:12, 15F

02/22 17:13, , 16F
你絕對是誤會了什麼...私有變數就是不給人讀也不給人改
02/22 17:13, 16F

02/22 17:14, , 17F
getter跟setter是提供外部合法進行存取的途徑 而非必要
02/22 17:14, 17F

02/22 17:15, , 18F
比方說你可以只設getter不設setter所以外部就只能讀
02/22 17:15, 18F

02/22 17:15, , 19F
也可以設setter但在其中設定檢查函式讓"只有合法的資料
02/22 17:15, 19F

02/22 17:15, , 20F
"能進入私有變數
02/22 17:15, 20F

02/22 17:15, , 21F
總而言之 你要在js用私有變數用var就好了
02/22 17:15, 21F

02/22 17:16, , 22F
setter跟getter都不是必要的 只有某些時候會用到
02/22 17:16, 22F

02/22 17:17, , 23F
硬要做私有變數又要弄getter/setter 所有語言都差不多
02/22 17:17, 23F

02/22 17:17, , 24F
一樣麻煩
02/22 17:17, 24F

02/22 17:18, , 25F
雖然有很多能讓語法變簡潔的lib/套件啦
02/22 17:18, 25F

02/22 17:30, , 26F
to mrb大 可能我沒有描述清楚我的問題,我回文一篇我看
02/22 17:30, 26F

02/22 17:30, , 27F
到的狀況
02/22 17:30, 27F

02/22 17:31, , 28F
底線倒是個很簡單的做法XD 我可以試試看 雖然有點不舒服
02/22 17:31, 28F

02/22 17:43, , 29F
話說單底線和雙底線,在js有很大的差別嗎
02/22 17:43, 29F

02/24 00:20, , 30F
我直接講結論,在 JS 去追求真正外部不能 access 的 private
02/24 00:20, 30F

02/24 00:20, , 31F
其實很多餘。另外底線什麼的只是 naming convention 沒有
02/24 00:20, 31F

02/24 00:20, , 32F
實質效益。
02/24 00:20, 32F

02/24 00:20, , 33F
另外 getter/setter 要不要作,取決於這個 properites 你
02/24 00:20, 33F

02/24 00:20, , 34F
怎麼用,我不覺得一定要寫,但是也不覺得寫了一定多餘。
02/24 00:20, 34F

02/24 17:55, , 35F
getter setter寫不寫真的是看需不需要 即使不需要寫了
02/24 17:55, 35F

02/24 17:55, , 36F
debug也會用到 所以不致於多餘
02/24 17:55, 36F
文章代碼(AID): #1H9oiLWW (Ajax)
文章代碼(AID): #1H9oiLWW (Ajax)