我知道JavaScript不支持私人成員,但您可以模擬這些成員。我想知道這是否值得。在JavaScript中使變量和/或函數保密是否有意義?我應該關心JavaScript中的私人成員
回答
在JavaScript中使變量和/或函數變爲私有是否有意義?
我會在更多的語言中討論'不'和'否',而不僅僅是JavaScript。
信息隱藏和封裝都非常值得稱道,但除非您的應用程序內部存在安全邊界,否則實際上並不需要通過嚴格的語言級別限制來強制保密。誰是你保護你的代碼的不受信任的攻擊者?自己呢?其他人在你的團隊?
在Java環境中,您理論上可能正在編寫一個類,以便對沙盒派對的資源進行有限的訪問,如applet。在這種情況下,您不希望小程序代碼能夠混淆私有成員,因爲它可能跨越安全邊界。
但在JavaScript中這是不可能的。您爲每個主機:端口獲得一個安全上下文,並且無法創建有效的安全邊界來限制共享您的上下文的代碼。當任何JS代碼可以完全接管頁面的UI時,隱藏變量的功能就毫無意義。 (另外,有些瀏覽器偶爾會有失敗私有變量的功能,例如Mozilla的舊版本,現在刪除了__caller__
。)
改爲使用Python方法:有一個有效私有約定,即使語言不執行它。在成員名稱的開頭加下劃線足以警告,類用戶不應該對該成員進行混淆,但在調試或原型設計時並不會讓您自己負擔煩人的額外工作,而需要暫時忽略私密性。
私有變量和封裝的目的不是安全或保護免受邪惡的人。這是抽象的。外部實體不需要知道內部是如何完成的。界面的佔地面積越小,消費者就越難理解。您應該公開最大限度地利用功能。 – 2011-11-19 21:50:05
這裏是StackOverflow上回答有關如何的情況下做到這一點的時候,你會想:
這裏是關於簽名的文章確實包括專家的座右銘:
'另一方面,因爲JavaScript沒有公共和私有方法的概念,所以沒有內部方法可以通過簡單地簽署類來保護。另外,所有方法都可以在運行時更改,因此必須在運行時進行保護。
在JavaScript中,您可以向現有對象添加新屬性,或者在運行時替換現有屬性(包括方法)。你不能用Java來做到這一點。因此,再一次,Java中的自動保護必須在JavaScript中分開處理。'
文章在
http://docs.sun.com/source/816-6409-10/sec.htm
。然而,我會想象使用私有變量和方法可能有一些功能在解決具有相同簽名但在不同的類中的方法和變量方面,或不?
- 1. Python中的私人成員
- 2. CoffeeScript中的私人成員?
- 3. Java中的私人成員
- 4. 私人成員應該明確聲明爲私人的慣用C#嗎?
- 5. PHP json_encode類私人成員
- 6. ASDocs忽略私人成員
- 7. 班級中的私人成員
- 8. R中的私人成員引用類
- 9. 私人課程中的公共成員
- 10. 推薦在javascript模塊中確定私人成員的方法
- 11. 我應該讓私人會員引用我的活動的觀點嗎?
- 12. 私人和公共成員應該如何在objective-c中實現?
- 13. MFC EditControl的值不是私人成員
- 14. 原型上的私人成員
- 15. 訪問班級的私人成員
- 16. C++類的私人成員函數
- 17. 私人類構造函數不能訪問私人成員
- 18. 關於訪問外部類的私人成員
- 19. JavaScript的私人和公共職能和成員
- 20. 初始化朋友的引用成員到類私人成員
- 21. 更改開發人員成員中心中的開發人員名稱
- 22. 我應該緩存manifest.json服務人員
- 23. 靜態::關於私人會員
- 24. 開發人員是否應該關心將來更改ORM的可能性?
- 25. 複製javascript對象與私人會員
- 26. php反序列化與私人成員
- 27. 在es6類上創建私人成員
- 28. 公共屬性和私人成員C#
- 29. PowerShell - 如何添加私人成員?
- 30. 訪問私人數據成員?
請參閱http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592我對這個問題的看法... – Christoph 2010-10-03 12:50:15