访问通过函数构造的JavaScript对象中的变量

访问通过函数构造的JavaScript对象中的变量,javascript,jquery,object,Javascript,Jquery,Object,我的应用程序正在访问我无法更改的第三方外部JavaScript文件 文件中有一个定义类似于以下内容的对象: object_1 = (function(){ var object_1_var = 'object_1_var_value'; return { obj_1_func: function() { console.log(object_1_var); } } })(window); 我需要能够访问对象中的对象

我的应用程序正在访问我无法更改的第三方外部JavaScript文件

文件中有一个定义类似于以下内容的对象:

object_1 = (function(){
    var object_1_var = 'object_1_var_value';
    return {
        obj_1_func: function() {
            console.log(object_1_var);
        }
    }
})(window);
我需要能够访问对象中的
对象\u 1\u var
,但我很难访问它

object_1.v // returns undefined
object_1.obj_1_func() // returns the value via console, but I need to assign it to a var.
我已尝试使用以下方法扩展该对象:(使用jQuerys$.extend())


如何才能访问
对象\u 1\u var

您将无法访问变量。它碰巧是一个私人会员。对象的私有成员只能由其成员函数访问


阅读。

公开,如下所示:

object_1 = (function(){
 var object_1_var = 'object_1_var_value';
 return {
    obj_1_func: function() {
        console.log(object_1_var);
    },
    object_1_var: object_1_var
 }
})(window);
编辑


如果无法编辑javascript(例如在第三方库中-抱歉遗漏),那么您将无法访问
object\u 1\u var
,因为它的作用域是闭包
object\u 1

的本地。遗憾的是,在本例中无法访问object\u 1\u var。变量被定义为该特定函数中的局部变量-其他函数可以看到它的唯一原因是因为它们也在该函数中定义。这种“闭包作用域”是JavaScript中一个有趣的特性,在其他地方不常见,但它是在JavaScript对象中定义“私有”变量的唯一真正方法

希望有帮助


在最坏的情况下,在过去,我通过有效地覆盖以前在其他地方定义的对象的定义(主要是在Greasemonkey脚本中定义的对象)来解决这类问题,但我不会容忍这种情况用于生产用途


这里的技巧是将整个脚本复制到您自己的脚本中。这是丑陋的地狱,但它可能只是工作!(YMMV)

在JS中,您试图实现的目标是不可能的


随着对象_1的构造,变量超出了该方法的范围。日志函数可以访问变量的原因是我们称之为“闭包”。

object\u 1\u var
是一个词汇范围的局部变量

这意味着不能通过将
object_1
扩展到其原始定义之外来访问它

访问它的唯一方法是在声明它的原始词法范围内添加函数:

object_1 = (function(){
    var object_1_var = 'object_1_var_value';
    return {
        obj_1_func: function() {
            console.log(object_1_var);
        }
        var_1: function(x) {
            if (typeof x !== 'undefined') {
                object_1_var = x;
            } else {
                return object_1_var;
            }
        }
    }
})(window);

但由于您无法修改对象1,恐怕您运气不好

获取结果并对其进行解析。如果您无法更改代码,则无法访问该变量。只是技术上正确:JavaScript没有“私有成员”的概念。它是一个局部变量,因此只能由在此范围或更低范围内定义的闭包访问。在这种情况下,函数恰好被分配给一个对象属性。是的,我知道。这都是Crockford的概念。这就是我将链接粘贴到他的网页的原因。@FelixKling DC称他们为“私人会员”。它与C++和Java中的等价物比较接近,它可能是可接受的。你知道是否有任何方法可以通过调用Objuts1.1.Objy1java函数()来输出到控制台日志?@ TigAlAn在大多数(所有)浏览器上,你可以重写<代码>控制台。
object_1 = (function(){
    var object_1_var = 'object_1_var_value';
    return {
        obj_1_func: function() {
            console.log(object_1_var);
        }
        var_1: function(x) {
            if (typeof x !== 'undefined') {
                object_1_var = x;
            } else {
                return object_1_var;
            }
        }
    }
})(window);