访问"私人" javascript中的变量

时间:2016-05-29 04:23:16

标签: javascript

我们说我有以下课程:

function MyClass(){

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

    var private = 10;
}


var test = new MyClass;

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

我想知道我是否可以从外部访问私有变量。看看chrome的控制台似乎是可能的,因为它的上下文显示了:

enter image description here

编辑:只是为了澄清:我知道如何正确地揭露它。只是想确定是否有一些hacky方式来访问它。

4 个答案:

答案 0 :(得分:4)

您的private变量是该函数范围的本地变量,在Javascript中,访问范围外的范围内的变量。您只能在范围内访问它。没有办法从Javascript代码本身解决这个问题。

调试器可以做什么(可以访问VM内部)与常规Javascript代码可以做的不同。调试器可以查看范围内部,但是范围外的JS代码不能

显然你可以为它制作一个存取器,但没有存取器,就无法从外面进入它。

答案 1 :(得分:2)

变量private被“困在”MyClass的封闭内。除非某些代码公开它,否则您无法访问它,就像“getter”函数一样。

function MyClass(){

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

    var private = 10;
}

顺便说一句,private is a reserved keyword

答案 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)

})