2010-10-03 35 views
2

我知道JavaScript不支持私人成員,但您可以模擬這些成員。我想知道這是否值得。在JavaScript中使變量和/或函數保密是否有意義?我應該關心JavaScript中的私人成員

+0

請參閱http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592我對這個問題的看法... – Christoph 2010-10-03 12:50:15

回答

2

在JavaScript中使變量和/或函數變爲私有是否有意義?

我會在更多的語言中討論'不'和'否',而不僅僅是JavaScript。

信息隱藏和封裝都非常值得稱道,但除非您的應用程序內部存在安全邊界,否則實際上並不需要通過嚴格的語言級別限制來強制保密。誰是你保護你的代碼的不受信任的攻擊者?自己呢?其他人在你的團隊?

在Java環境中,您理論上可能正在編寫一個類,以便對沙盒派對的資源進行有限的訪問,如applet。在這種情況下,您不希望小程序代碼能夠混淆私有成員,因爲它可能跨越安全邊界。

但在JavaScript中這是不可能的。您爲每個主機:端口獲得一個安全上下文,並且無法創建有效的安全邊界來限制共享您的上下文的代碼。當任何JS代碼可以完全接管頁面的UI時,隱藏變量的功能就毫無意義。 (另外,有些瀏覽器偶爾會有失敗私有變量的功能,例如Mozilla的舊版本,現在刪除了__caller__。)

改爲使用Python方法:有一個有效私有約定,即使語言不執行它。在成員名稱的開頭加下劃線足以警告,類用戶不應該對該成員進行混淆,但在調試或原型設計時並不會讓您自己負擔煩人的額外工作,而需要暫時忽略私密性。

+3

私有變量和封裝的目的不是安全或保護免受邪惡的人。這是抽象的。外部實體不需要知道內部是如何完成的。界面的佔地面積越小,消費者就越難理解。您應該公開最大限度地利用功能。 – 2011-11-19 21:50:05

0

這裏是StackOverflow上回答有關如何的情況下做到這一點的時候,你會想:

JavaScript private methods

這裏是關於簽名的文章確實包括專家的座右銘:

'另一方面,因爲JavaScript沒有公共和私有方法的概念,所以沒有內部方法可以通過簡單地簽署類來保護。另外,所有方法都可以在運行時更改,因此必須在運行時進行保護。

在JavaScript中,您可以向現有對象添加新屬性,或者在運行時替換現有屬性(包括方法)。你不能用Java來做到這一點。因此,再一次,Java中的自動保護必須在JavaScript中分開處理。'

文章在

http://docs.sun.com/source/816-6409-10/sec.htm

。然而,我會想象使用私有變量和方法可能有一些功能在解決具有相同簽名但在不同的類中的方法和變量方面,或不?