0

我想创建一个对象,它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
}
4

4 回答 4

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);
于 2012-08-31T16:54:56.817 回答
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;            
    }
}
于 2012-08-31T16:57:27.310 回答
0

b创建对象后添加:

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

object.b = object.a.length
于 2012-08-31T16:58:09.217 回答
0

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

于 2012-08-31T16:56:03.657 回答