javascript - js对象内部方法访问属性报错
天蓬老师
天蓬老师 2017-04-11 10:07:59
[JavaScript讨论组]

var a = {

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

}
alert( a.z );

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(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;
};
ringa_lee

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

PHP中文网

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

伊谢尔伦

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

巴扎黑

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号