Javascript:length不';不能在对象内部的数组上工作?

Javascript:length不';不能在对象内部的数组上工作?,javascript,arrays,json,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 obj

我想创建一个对象,使
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);

[更新]即使以这种方式创建对象,也不起作用:

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

主要的问题是,在像第一个示例一样的javascript数据声明中,
this
的值没有设置为要定义的对象。因此,由于
this
不是您的对象,因此对象声明中的
this.a
并不引用对象的
a
属性

它是数据声明之前上下文中的任何内容。如果这是全局上下文,那么
this
将是
窗口
对象,而
this.a
可能不存在。如果它不存在(例如,它是
未定义的
),那么当您尝试引用
this.a.length
时,您试图读取属性
.length
,因为它不是对象,这是一个脚本错误


要解决这个问题,通常不应该将数组的长度复制到另一个属性。这只会给您一个错误的机会,使其与阵列的实际长度不同步。如果需要阵列的长度,应根据需要使用以下工具检索:

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

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

主要的问题是,在像第一个示例一样的javascript数据声明中,
this
的值没有设置为要定义的对象。因此,由于
this
不是您的对象,因此对象声明中的
this.a
并不引用对象的
a
属性

它是数据声明之前上下文中的任何内容。如果这是全局上下文,那么
this
将是
窗口
对象,而
this.a
可能不存在。如果它不存在(例如,它是
未定义的
),那么当您尝试引用
this.a.length
时,您试图读取属性
.length
,因为它不是对象,这是一个脚本错误


要解决这个问题,通常不应该将数组的长度复制到另一个属性。这只会给您一个错误的机会,使其与阵列的实际长度不同步。如果需要阵列的长度,应根据需要使用以下工具检索:

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

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

在第一个示例中,“b”未定义,因为它正在查找名为“b”的变量,而不是对象“object”内部的属性“b”。您应该使用object.b。

在第一个示例中,“b”未定义,因为它正在查找名为“b”的变量,而不是对象“object”内部的属性“b”。您应该改用object.b。

对象的所有属性都是一次实例化的,因此
在创建属性
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;            
    }
}

对象的所有属性都会一次实例化,因此
在创建属性
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;            
    }
}

创建对象后,将
b
添加到对象:

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

object.b = object.a.length

创建对象后,将
b
添加到对象:

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

object.b = object.a.length

我不确定“静态”这个词在这里是否合适。是吗?我不确定“静态”这个词在这里是否合适。是吗?您的更新不起作用,因为您试图在声明变量之前引用它(想想javascript使用的R到L求值)@jbabey是的,我现在明白了。非常感谢你们回答这个问题!这些都是很好的答案:)你的更新不起作用,因为你试图在变量被声明之前引用它(想想javascript使用的R到L求值)@jbabey是的,我现在明白了。非常感谢你们回答这个问题!这些都是很好的答案:)