对象属性始终未定义

时间:2010-07-05 13:39:18

标签: javascript javascript-objects

这是我第一次使用JS对象而且我很困惑为什么这个属性总是未定义的:

function Rotator() {
    this.interval = 300;
    this.image = 0;
    this.images = undefined;
}

Rotator.prototype.Fetch = function(links) {
    console.log("Fetch called");
    this.images = links;
}

Rotator.prototype.Current = function() {
    if (this.images == undefined) {
        console.log("Error, images is undefined");
    }
    return this.images[this.image];
}

r = new Rotator;
$.getJSON("./data.php", function (data) {
    r.Fetch(data.images);
});

console.log(r.Current());

我得到的错误是:

  

未捕获的TypeError:无法读取未定义的属性“0”

返回的JSON工作正常,并且fetch在控制台中被标记为已调用(记录时数据也很好)。为什么Rotator.images总是未定义?

编辑:一些console.log结果:

  • data.images中记录$.getJSON会产生正确的数据。
  • links中记录Fetch会产生正确的数据。
  • this.images中记录Fetch会产生正确的数据。
  • this.images中记录Current会导致无效。

3 个答案:

答案 0 :(得分:2)

因为获取JSON是异步的,所以这就是数据仅在回调函数中可用的原因。

$.getJSON("./data.php", function (data) { // callback function
    r.Fetch(data.images); // this will run when the data is available
});

console.log(r.Current()); // this will run immediately -> data.images is null

依赖于数据的所有内容都应放在回调函数中!

答案 1 :(得分:0)

您不能以这种方式使用undefined。请改用null

this.images = null;

if (this.images == null) {

编辑:

如果它为null,您还必须避免使用images属性:

Rotator.prototype.Current = function() {
  if (this.images == null) {
    console.log("Error, images is undefined");
    return null;
  }
  return this.images[this.image];
}

答案 2 :(得分:0)

这会让我的脖子上有纯粹主义者还是可以接受?

Rotator.prototype.Current = function() {
    if (this.images) return this.images[this.image];
    console.log("Error, images is undefined, null, empty or 0");
}