2016-05-16 42 views
0

我需要從匿名函數中訪問私有變量。該匿名函數由以下設置:JavaScript從匿名函數中讀取私有變量

coolObject = new (function(){ 
    this.public = "public"; 
    var private = "secrets"; 

    // General functions here, no getter or setter for private 
})(); 

我可以很容易地閱讀和做console.log(coolObject.public)coolObject.public = "newValue"coolObject.public,但我怎麼可以做同樣的私有變量?另一件事是我不能將代碼添加到構造函數中,coolObject將始終像這樣初始定義。

因此,總結一下,有沒有一種方法可以從JavaScript中的匿名函數訪問私有變量,如果是這樣,怎麼辦?

編輯:我已經嘗試通過做coolObject.getPrivate = function(){return private;};創建getters和setters,但那不起作用。

+4

沒有對'coolObject'構造函數進行任何更改 - 否 – dotnetom

+2

由於某種原因,此類變量被稱爲「private」。順便說一句,這個函數是匿名的這個事實在這裏是無關緊要的。 – nnnnnn

+1

是不是私人?似乎是一個私人變量的目標是在那裏按預期工作。 – Spaceman

回答

2

這是不可能的,不改變你有的代碼。

正如你所說的,你不能改變代碼,你不能讀取私有變量。將變爲專用的原因是爲了確保您不能從範圍之外讀取和寫入它。如果可能的話,私有變量的含義和原因就會丟失。

+0

什麼?人們總是創建getter和setter來私有變量。它絕不會違反變量爲私有的原因。它被稱爲**封裝**。 – 4castle

+0

@ 4castle - 是的,但是從對象外部你不能訪問變量本身,你所能做的就是調用getter和setter。 (在這種情況下,OP說他們不能改變構造函數,所以他們不能添加getter或setter。) – nnnnnn

+0

@nnnnnn我只是反對他們對私有變量的描述。在許多情況下,它不是簡單地限制對變量的訪問,而是爲了封裝而完成的。這是「理性」和「定義」之間的區別。 – 4castle