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