js可以通过解构后得到的属性获取这个被解构的对象吗?

js可以通过解构后得到的属性获取这个被解构的对象吗?

//创建一个对象obj
let obj = {
  a: "Bob",
  b: new Date().toLocaleTimeString(),
  c: function () {
    console.log(this.a)
  }
}

//结构得到它的属性a
let {a} = obj
//那么有没有什么方法可以把这个完整的obj对象,通过解构后的a,表示出来呢?
//下面是我的一些愚蠢的尝试
console.log(a.__proto__)            //[String: '']
console.log(a.constructor)          //[Function: String]
console.log(a.__proto__.constructor)      //[Function: String]

还有我发现解构赋值之后,你再对原对象的值进行修改不会影响解构得到的值

let {a} = obj
obj.a = "Jack"        //修改原对象的值
console.log(a)        //Bob

所以说解构赋值其实是重新创建了一个变量a,然后在解构的同时把值复制过来了吗?
如果是这样,那确实无法从a 来重新获得obj了。

对了,js本身(或者说所有编程语言)就是无法用一个对象的某个属性,重新又逆向得到这个对象的吧?求大牛解答一下

阅读 341
评论 2019-08-12 提问
    2 个回答
    雾秋
    • 1.1k
    1. 从a获得obj是肯定不行的
    2. 通过修改obj.a 影响a是可以做到的。首先你要明白引用赋值传值赋值,

    修改代码

    let obj = {
      a: [1,2,3],
      b: {xx: 1}
    }
    
    let {a, b} = obj
    a.push(4)
    b.xx = 2;
    console.log(obj.a) // [1,2,3,4]
    console.log(obj.b) // {xx:2}

    你如果企图直接b = 1来改obj.b的值,那是不可能的,因为之前b和obj.b只是指向同一个内存地址, 当b = 1后,b指向的位置改变了,但是obj.b的位置没变.而采用我上面代码的方式,就是改变那个地址的值,所以他们都会同时改变.

    评论 赞赏 2019-08-12
      fengxh
      • 421

      解构,不就是定义变量吗。例如var a = obj.a,当你改变obj.a时(此处a是普通数据,非引用数据),a肯定不会被改动的。

      而且a没有任何属性指向原对象obj,你多看下js的数据结构就了解了

      评论 赞赏 2019-08-12
        撰写回答

        登录后参与交流、获取后续更新提醒