2013-03-02 115 views
0

我正在为某个站点编写userscript。 我需要访问函数中的内部变量。例如,在下面的代码我需要访问 “私有财产” B对象的Ç在JavaScript中访问内部变量

function a(){ 
    var b; 
    //assignment to b and other stuff 
}; 
var c=new a(); 

我不能更改网站的代码,我只可以改变BORWSER延长SCRIPTISH谱写USERSCRIPT。 我的浏览器是最新的firefox。 即使我不得不更改Scriptish,我也需要获得访问权限。

+4

你不能直接这样做,将'b'分配为'this'的属性,它将是'c'的属性。要么是,要么附加一个返回'b'的值的方法/函数。 (你将不得不在构造函数中创建该函数,它也不能用于原型方法) – 2013-03-02 20:21:31

+0

我认为闭包在这种情况下会有帮助吗?但我可能是错的。 – aug 2013-03-02 20:27:07

+0

代码不是我的,但我需要仅使用脚本和Scriptish来更改它。我无法做到全球化,故意将它制作成本地的,以防止用户写作。 还有一次:我在写USERSCRIPT。使用FIDDLER及其脚本引擎也不是很好的解决方案。 – KOLANICH 2013-03-02 20:47:02

回答

1

你不能访问你的函数的内部变量,你应该把它作为全局变量来从外部获取它。

var b; 
function a(){ 
b=1; 
    //assignment to b and other stuff 
}; 
var c=new a(); 
document.write(c.b); 

,输出为1。

+1

不是。在问题中,函数a中的b是局部的。你只是在改变全球。将行'b = 1;'更改为'var b = 1'并重新测试。 – Hogan 2013-03-03 14:06:10

0

在你的代码b不是一个私有变量,而是一个局部变量。并且在执行var c=new a();之后b不再存在。因此,您无法访问它。

但是如果你使用closures,一切都改变了:

function a(){ 
    var b; 
    //assignment to b and other stuff 
    this.revealB = function() { 
     return b; 
    } 
}; 
var c = new a(); 
alert(c.revealB()); 

这里b仍然是一个局部变量,但它的寿命是由关闭等影响,因此仍然活着的时候,我们调用revealB

+0

OP的原始文章中没有函数revealB,而且他不能更改该代码。 – Hogan 2013-03-03 14:06:49

0

这是很简单的事,它继承应用程序是伟大的:

您只需返回任何你想要的,也许通过方法返回的,后来在其他功能上重新使用它,并建立它。

举例如下:

function a(){ 
     var b; 
     //assignment to b and other stuff 
     return b; 
     }; 

    // or 

    function a(){ 
     var b, result; 
     //assignment to b and other stuff 
     returnInitial: function() { 
      return b; 
     } 
     // other stuff with b 
     return result; 
    }; 

稍后,可以使用所谓的“寄生继承”,用所有局部变量和添加新的方法启动等功能,这里面全功能的,就像这样:

var a function() { 
     var b, result; 
     //assignment to b and other stuff 
     returnInitial: function() { 
      return b; 
     } 
     // other stuff with b 
     return result; 
} 
var extendedA function() { 
    var base = new a; 
    var b = a.returnInitial(); 
    a.addToB = function (c) { 
    var sum = c + a.returnInitial(); 
    return sum; 
    } 
} 

所以,你现在可以得到

var smt = new extendA(); 
var c = 12; //some number 
var sumBC = extendA.addToB(c); 

对于所有有这些伟大PRACT我建议yutube搜索道格克罗克福德关于js对象处理的讲座。

请注意,如果您未初始化新实例,则需要使用新的动态对象处理方法,因为JavaScript使用的动态对象处理可能会使原始对象崩溃。

+0

这不起作用 - 在OP的问题中没有返回b的函数。 – Hogan 2013-03-03 14:04:37