为了账号安全,请及时绑定邮箱和手机立即绑定

对象内的属性可以直接赋值为另一个属性吗

对象内的属性可以直接赋值为另一个属性吗

小怪兽爱吃肉 2019-03-05 21:51:44
有一个对象 avar a = {    p1: [1],    p2: p1}我要如何写是的p2指向p1
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

如果不介意在对象字面量外写的话,就是楼上那样:


var a = {

    p1: [1]

}

a.p2 = a.p1

如果题主要在对象字面量内写的话,可能要这样,不过这里 p2 实际上是访问器属性:


var a = {

    p1: [1],

    get p2(){return this.p1},

    set p2(v){this.p1=v}

}

https://img1.sycdn.imooc.com//5c8375620001834f01850112.jpg


题主可能是想有这样的代码:


var a = {

    p1: [1],

    p2: a.p1//this.p1

};

实际上都是不行的,因为对象字面量里 this 和 a 都是从作用域链中去寻找的,ES6之前只有两个作用域,全局或函数,在这里,没有函数,就是全局作用域,所以 this 和 a 就会从当前全局作用域中去寻找,这个可以通过下面代码验证:


window.p1=1;

var a = {

    p1: [1],

    p2: this.p1

}

a.p2// 1 ,全局作用域中,浏览器端 this 指向window,所以a.p2被 window.p1 赋值

再考虑下面代码:


var a={p1:111};

var a = {

    p1: [1],

    p2: a.p1

}

a.p2//111

这个稍微复杂些,在这个赋值表达式里,


1、先获得 a 的引用,此时 a 还是指向 {p1:111}

2、计算右值,通过 var a={p1:111}; 和 a.p1 得出p2=111,p1=[1]

3、把 a 重新指向这个对象;

关于赋值执行顺序,可以参考这篇博客,再考虑下面代码:

var b={p1:111};

var a = {

    p1: [1],

    p2: a.p1// 在这里计算 a.p1值的时候,由于 var 的变量提升,这里 a 被提前声明,不过值是 undefined,所以报错:Cannot read property 'p1' of undefined

}

上面的代码实际相当于:


var a,b;//赋值前值为undefined

b={p1:111};

a = {

    p1: [1],

    p2: a.p1//报错因为 a 是 undefined,获取 undefined 的属性会报错

}


查看完整回答
反对 回复 2019-03-09
  • 1 回答
  • 0 关注
  • 1290 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信