js对象内部方法访问属性报错

fcxh
  • 434

var a = {

x : 3,
y : 9,
z : a.y + 1;

}
alert( a.z );

错误提示: cannot read property of "y" of undefined;
为什么?

回复
阅读 4.2k
5 个回答
✓ 已被采纳
var a = {
    x:3,
    y:9,
    z:a.y + 1
};

表达式赋值先计算赋值操作符右边的值,然后把右边的计算结果赋值给左边的变量
左边的变量在没有被赋值前,其值为undefined
所以在{}对象字面量表达式执行完之前,a的值一直为undefined
故JS解释器会提示如上的错误信息给你

那么修改为

var a = {
    x:3,
    y:9,
    z:this.y + 1
};

代码运行没有错误,那么a.z是期望的10么?

console.log(a.z);

很不幸,给出的值是NaN,原因在于此处的this代表的是全局对象,而不是期望的变量a指向的对象,全局对象下没有y这个属性,this.y值为undefiend,和1执行加操作后,其值就为NaN

想要在字面量表达式中使用当前构建的对象的属性值是不能达成的

不过可以试试这样的~

var a=new function(){
    this.x=3;
    this.y=9;
    this.z=this.y+1;
};

a.y + 1是在变量a声明过程中用到的计算表达式,但既然说了,这个时候a还在声明阶段,那当然是undefined了,换成this.y + 1

var a={}; 这种方式是对象常量,对象的属性会立即计算执行,在堆中开辟一个内存存放,然后a这个变量指向这个内存。这就是你在a属性中引用别的属性报错的原因,因为a这时还是undefined。有人建议使用在a属性中使用this,是希望this指向的是a,但实际不是,应该是window或global。
解决方式 分开计算 a.c=a.b+4
改为函数 a.c= function(){return this.b+4}

原因楼上已经说了,
换成this.a.y + 1

一定要这么写可以考虑用闭包

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏