3

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

在该文件中有一个对象,其定义类似于如下:

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

我需要能够访问object_1_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())

object_2 = (function(){
    return {
        obj_2_func: function() {
            return object_1_var;
        }
    }
})(window);

$.extend(object_1, object_2);

var my_var = object_1.obj_2_func(); // returns 'Uncaught ReferenceError: object_1_var is not defined'

我该怎么做才能访问object_1_var

4

5 回答 5

4

您将无法访问该变量。它恰好是私人成员。对象的私有成员只能通过其成员函数访问。

这个

于 2012-10-10T22:08:38.613 回答
3

将其公开,如下所示:

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_1_var因为它的范围是闭包的本地object_1

于 2012-10-10T22:10:03.893 回答
3

object_1_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);

但既然你不能修改object_1,恐怕你就不走运了!

于 2012-10-10T22:13:22.163 回答
2

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

希望有帮助!


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

这里的诀窍是将整个脚本复制到您自己的脚本中。它很丑陋,但它可能会起作用!(YMMV)

于 2012-10-10T22:10:47.407 回答
2

你想要完成的事情在 JS 中是不可能的。

随着 object_1 的构造,变量超出了该方法的范围。日志功能可以访问变量的原因就是我们所说的“闭包”。

于 2012-10-10T22:12:20.287 回答