访问通过函数构造的JavaScript对象中的变量
我的应用程序正在访问我无法更改的第三方外部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); 我需要能够访问对象中的对象
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);