Javascript:length对于对象内的数组不起作用?

时间:2012-08-31 16:52:12

标签: javascript arrays json

我想创建一个对象,object.a是一个数组,而object.b是它的长度,这就是我所拥有的:

var object = {
   a:[1,2,3,2],
   b: this.a.length
}
alert(b);

但是这不会提醒4. b: this.a.length

有问题
Uncaught TypeError: Cannot read property 'length' of undefined

如果有人能向我解释为什么会这样,我会很高兴。

如果我这样写,它会动作警告4:

 var object = {
       a:[1,2,3,2]
 }
    alert(object.a.length);

[update]甚至以这种方式创建对象,它不起作用:

var object = {
   a:[1,2,3,2],
   b:object.a.length
}

4 个答案:

答案 0 :(得分:3)

主要问题是,在第一个示例的javascript数据声明中,this的值未设置为正在定义的对象。因为this不是您的对象,所以对象声明中的this.a不会引用您对象的a属性。

在您的数据声明之前,它就是上下文中的任何内容。如果那是全局上下文,则this将是window对象,this.a可能不存在。如果它不存在(例如它是undefined),那么当你尝试引用this.a.length时,你试图读取属性.length,这不是一个对象,那是一个javscript错误。


至于解决这个问题,将数组的长度复制到另一个属性通常是个坏主意。这只是让你有机会出错,与数组的实际长度不同步。如果你想要数组的长度,你应该根据需要检索它:

object.a.length

如果您真的希望它是一个属性(具有固定值且在a更改时不会更改),您可以在创建对象后设置它:

var object = {
   a:[1,2,3,2],
};
object.b = object.a.length;
alert(object.b);

答案 1 :(得分:1)

一次实例化对象的所有属性,因此this在创建属性b时引用窗口对象。您需要推迟b的值的解释,一种方法是使用函数:

var object = {
    a:[1,2,3,2],
    b: function () {
        return this.a.length;
    }
}

另一种方法是在声明对象文字后添加属性b

var object = {
    a:[1,2,3,2]
}
object.b = object.a.length;

最后,在较新的浏览器上,您可以利用getter:

var object = {
    a:[1,2,3,2],
    get b() {
        return this.a.length;            
    }
}

答案 2 :(得分:0)

在第一个例子中,'b'是未定义的,因为它正在查找名为'b'的变量而不是对象'object'中的属性'b'。你应该使用object.b。

答案 3 :(得分:0)

创建对象后添加b

var object = {
    a:[1,2,3,2]
}

object.b = object.a.length