[英]Accessing “private” variables in javascript
您的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
。
優點:
缺點:
foo
放入全局狀態,您將覆蓋第二個。
我一直認為必須有一種更狡猾(而且更方便)的方法,也許就像使用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.