给出以下声明
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中的数组"没有给我任何好结果。我很感激任何帮助。
答案 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
。因此,在Func3
和Func4
中,将代码更改为:
this.addItem = function (a, b) {
this.items[items.length] = new Func1(a, b);
}
我希望有所帮助。