访问具有相同名称的javascript对象

时间:2012-09-21 18:20:05

标签: javascript asp.net

我有一个用户控件组,并在控件内定义了javascript。在一个页面中,我有两个这样的控件,它们独立工作。渲染的javascript类似于下面的内容:

//control 1
var Groups = (function () {
var obj = {};
obj.selectedid = 2;
return obj;
}());

//control 2
var Groups = (function () {
var obj = {};
obj.selectedid = 2; //it is different here, to keep it simple i just hardcoded as '2'
return obj;
}());

有人可以告诉我如何访问页面上的第一组变量(控件)。我认为像Groups [0]这样的东西会给我结果,但事实并非如此。


感谢您的回复。非常感激。我要添加更多信息要清楚。用户控件包含双列表框,用户可以从list1添加/删除值到list2。所以我将所有这些逻辑封装如下。

    var Groups = (function () {
    var obj = {};
    obj.selectedid = 2;

    //some local functions for internal operations such as
    function moveGroups(source, target){        
    }

     //there are public functions to initialize this control or to add groups as below 
    // Groups can be added from external page by calling  Groups.AddGroups(data);
    obj.AddGroups = function(data) {
           //refers to local variables and functions and adds data to listboxes
      };

    return obj;
    }());

问题是我在页面上有两个这样的组控件。 Group1包含自己的双列表和类似的Group2。现在,我需要访问两个对象的AddGroups函数,例如来自页面的Groups1.AddGroups(data)或Groups2.AddGroups(data)。


我已经解决了以下问题。

var Groups = Groups || []; //Check object already exists
Groups.push( 
//kept all the existing code here...
(function () {
    var obj = {};
    obj.selectedid = 2;

    //some local functions for internal operations such as
    function moveGroups(source, target){        
    }

     //there are public functions to initialize this control or to add groups as below 
    // Groups can be added from external page by calling  Groups.AddGroups(data);
    obj.AddGroups = function(data) {
           //refers to local variables and functions and adds data to listboxes
      };

    return obj;
    }())

);

现在在我的页面中,我引用了:

Groups[0].AddAvailGroups();
Groups[1].AddAvailGroups();

5 个答案:

答案 0 :(得分:0)

如果这两个片段都声明了全局( EVIL )变量Groups,则在调用第二个匿名函数后,第一个对象将永远丢失。这很简单,我很害怕。如果它们不是全局变量,并且是不同范围的一部分,那么访问该属性是一件简单的事情:

Groups.selectedid;//will be either 1 or 2 depending on the scope. 

groups的值是对obj对象的引用,匿名函数被立即声明和调用(闭包),并返回一个对象,selectedid作为属性。因此Group具有该属性。如果您的代码类似于以下内容,则Groups[0]会起作用:

var Groups = (function()//assign return value
{
    return [2];//return this value
})();//call the function

答案 1 :(得分:0)

您需要提供两个不同的名称:

var Groups1 = ...

var Groups2 = ...

之后,您可以访问Groups1.selectedid

但我不清楚这些对象和变量的目的是什么。

答案 2 :(得分:0)

通过

Groups.selectedid

但如果它在相同的代码中,则无法工作,因为您为相同的变量分配了不同的值。你需要分开:

var Groups1 = ...
var Groups2 = ...

答案 3 :(得分:0)

您应该在控件内为应该引用组的js变量生成GUID(这可以是控件的id加上一些前缀)。 并用它们创建全局数组。在这种情况下,您可以随时访问您的群组

答案 4 :(得分:0)

两个var Groups声明定义了相同的内存位置。

所以你的第二个陈述

//control 2
var Groups = (function () {

将覆盖先前存储在Groups变量中的值。

如果要将群组作为集合进行访问,则应明确执行此操作:

var Groups = []; // array/list;

Groups.push( ... ); // control 1
Groups.push( ... ); // control 2