创建和访问对象数组

时间:2016-06-20 06:29:12

标签: javascript arrays

给出以下声明

function Func1(a, b) {
    this.a = a;
    this.b = b;
};

我想为Func1对象数组创建一个占位符。就我所见,我宣布了一系列项目,因此它应该已经定义。但是每次我试图访问数组时,它都会给我" undefined"错误。

var Func2 = function () {
    var items = [];

    this.addItem = function (a, b) {
        items.push(new Func1(a, b));
    }

    var function2 = new Func2();
    function2.addItem(2, 'test');
    window.alert(function2.items[0].b); // this gives error "Unable to get property '0' of undefined or null reference. I'd like to be able to show 'test' here.

我还修改了代码以使用declare' this.items = []'而不是' var items = []',它给了我一个不同的错误,如下所示:

 var Func3 = function () {
     this.items = [];

     this.addItem = function (a, b) {
         items.push(new Func1(a, b)); // this gives error 'items' is undefined
     }
 };

 var function3 = new Func3();
 function3.addItem(3, 'test'); 
 window.alert(function3.items[0].b); // I want to show 'test' here

我再次修改了addItem函数,仍然出现错误

var Func4 = function () {
    this.items = [];

    this.addItem = function (a, b) {
        items[items.length] = new Func1(a, b); // this gives error 'items' is undefined,  too
    }
};

我只是无法找出代码失败的原因,而Google搜索并没有给我太多帮助。我可能没有使用正确的关键字来搜索,但搜索"访问javascript中的数组"没有给我任何好结果。我很感激任何帮助。

5 个答案:

答案 0 :(得分:2)

当您使用this.items = [];时,您应该使用this.items而不是items。在发布的代码中没有将全局或本地变量定义为items,这就是您收到此类错误的原因。

this.items.push('...');

在构造函数中使用var items = [];时,变量是 local 到构造函数,因此外部作用域无法访问变量。您应该定义一个返回值的方法,或者将items定义为实例(对象)属性。

这是两个选项:

var Option1 = function () {
    var items = [];

    this.addItem = function (a, b) {
       items.push(new Func1(a, b));
    }

    this.getItems = function() {
       return items;
    }
}

var Option2 = function () {
    this.items = [];

    this.addItem = function (a, b) {
       this.items.push(new Func1(a, b));
    }
}

答案 1 :(得分:1)

这看起来像一个范围问题,在声明项目和调用它时使用“this”。检查代码段:

function Func1(a, b) {
    this.a = a;
    this.b = b;
};

var Func2 = function () {
    this.items = [];

    this.addItem = function (a, b) {
        this.items.push(new Func1(a, b));
    }
}

var function2 = new Func2();
function2.addItem(2, 'test');
window.alert(function2.items[0].b);

答案 2 :(得分:0)

如果你想让项目隐藏在函数之外,那么你需要添加一个getter函数来访问items变量:

function Func1(a, b) {
    this.a = a;
    this.b = b;
};

var Func2 = function () {
    var items = [];

    this.addItem = function (a, b) {
        items.push(new Func1(a, b));
    }

    this.getItem = function(index) {
      return items[index];
    };
}

var function2 = new Func2();
function2.addItem(2, 'test');
console.log(function2.getItem(0).b);

答案 3 :(得分:0)

在这种情况下避免这种上下文混淆的方法是缓存自引用。

var Func2 = function () {
    var self = this;

    self.items = [] 

    self.addItem = function (a, b) {
        self.items.push(new Func1(a, b));
    }
}

这样,正确的上下文被添加到addItem()中,无论从哪里调用它都应该运行。

答案 4 :(得分:0)

代码有几个问题:

  • var items,只属于构造函数,因此实例不会获得它的副本。因此,在构造函数(this.items)中使用Func2,因此当您创建Func2的实例时,该实例具有该实例变量。

  • 我看到您有时使用items,有时使用this.items,但始终使用this.items。因此,在Func3Func4中,将代码更改为:

    this.addItem = function (a, b) {
       this.items[items.length] = new Func1(a, b);  
    }
    

我希望有所帮助。