簡體   English   中英

在javascript中訪問“私有”變量

[英]Accessing “private” variables in javascript

假設我有以下課程:

function MyClass(){

    this.public = function(){
        console.log(private);
    };

    var private = 10;
}


var test = new MyClass;

test.public(); // logs 10
test.private; // undefined

我想知道是否可以從外部訪問私有變量。 查看 chrome 的控制台似乎是可能的,因為它顯示了它的上下文:

在此處輸入圖片說明

編輯:只是為了澄清:我知道如何正確公開它。 只是想確定是否沒有一些hacky方式來訪問它。

您的private變量是該函數作用域的局部變量,並且在 Javascript 中,無法從作用域外訪問作用域內的變量。 您只能從范圍內訪問它。 沒有辦法從 Javascript 代碼本身解決這個問題。

調試器可以做的事情(可以訪問 VM 內部)與常規 Javascript 代碼可以做的事情不同。 調試器可以查看范圍內,但范圍外的 JS 代碼不能。

顯然你可以為它制作一個存取器,但是沒有存取器,就沒有辦法從外面得到它。

變量private被“困住”在MyClass的閉包中。 除非某些代碼公開它,否則您無法訪問它,例如“getter”函數。

function MyClass(){

    this.getter= function(){
        return private;
    };

    var private = 10;
}

順便說一下, private是一個保留關鍵字

有一種笨拙但不是超級方便的方法。

在可以訪問范圍的地方放置一個斷點。

function MyClass(){

    this.public = function(){
        console.log(private); // <<< BREAKPOINT HERE!
    };

    var private = 10;
}

現在調用公共函數,它將使您到達該斷點。

當你被困在那里時,通過在控制台上輸入這樣的內容,將private拉入全局范圍:

var window.foo = private;

利潤。 您現在可以隨時從控制台獲取foo

您可以對范圍內可用的任何內容執行此操作。 如果你有var private2 = 7; var private ,您也可以訪問它,即使它沒有在this.public


優點:

  • 在調試時隨時訪問該值。
  • 恭喜! 你是最時髦的人。

缺點:

我一直認為必須有一種更狡猾(而且更方便)的方法,也許就像使用eval將公共方法修補回自身, eval使用上述范圍破壞代碼(這將消除斷點調用),但還沒有完全找到它還。

我曾嘗試從外部添加一個 getter 函數,但似乎不起作用。

像這樣的東西。 如果有人對如何做到這一點有任何想法,我會很高興閱讀它。

test('testing MyClass private var', () = {
  const priv = new MyClass()
  priv.getPrivate = function(){return this.private}
  
 expect(priv.getPrivate()).toBe(10)

})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM