我们说我有以下课程:
function MyClass(){
this.public = function(){
console.log(private);
};
var private = 10;
}
var test = new MyClass;
test.public(); // logs 10
test.private; // undefined
我想知道我是否可以从外部访问私有变量。看看chrome的控制台似乎是可能的,因为它的上下文显示了:
编辑:只是为了澄清:我知道如何正确地揭露它。只是想确定是否有一些hacky方式来访问它。
答案 0 :(得分:4)
您的private
变量是该函数范围的本地变量,在Javascript中,无访问范围外的范围内的变量。您只能在范围内访问它。没有办法从Javascript代码本身解决这个问题。
调试器可以做什么(可以访问VM内部)与常规Javascript代码可以做的不同。调试器可以查看范围内部,但是范围外的JS代码不能
显然你可以为它制作一个存取器,但没有存取器,就无法从外面进入它。
答案 1 :(得分:2)
变量private
被“困在”MyClass
的封闭内。除非某些代码公开它,否则您无法访问它,就像“getter”函数一样。
function MyClass(){
this.getter= function(){
return private;
};
var private = 10;
}
答案 2 :(得分:0)
有一种笨拙但不是超级方便的方法。
在可以访问范围的地方放置一个断点。
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
将公共方法修补回自身,并使用上述范围破坏代码(这将消除断点调用),但还没有完全找到。
答案 3 :(得分:-1)
我尝试从外部添加 getter 函数,但似乎不起作用。
类似的东西。如果有人对如何做到这一点有任何想法,我会很高兴阅读它。
test('testing MyClass private var', () = {
const priv = new MyClass()
priv.getPrivate = function(){return this.private}
expect(priv.getPrivate()).toBe(10)
})