美文网首页
set , get 的一些疑问笔记

set , get 的一些疑问笔记

作者: wudimingwo | 来源:发表于2018-12-18 17:37 被阅读0次

    一个疑问
    set,get 用于定义一个属性的返回值,输入值.
    能不能用 set,get 模拟 普通变量的取值赋值?

    第一种思路,
              let _age = 18;
              let obj = {
                get age () {
                  return _age
                },
                set age (value) {
                  _age = value
                }
              }
    但这样做, 就必须有另一个变量_age 存在.
    有没有办法, 不需要这个_age,也能实现?
    
    第二种思路是, 我每次 set的时候, 直接重写一次这个对象的方式,
    重写一次get,
              let obj = {
                get age () {
                  return 18
                },
                set age (value) {
                  obj = {
                    get age () {
                      return value
                    },
                    set age (value) {
                      
                    }
                  }
                }
              }
    但很明显这是不行的, 且不说动作太大,
    这只能完成有限次的更改.
    
    有必要深入了解一下set,和get
    

    理解Object.defineProperty的作用

    然后就明白, set,get 是这个描述对象里的属性

    第三种,修改 描述属性
          let obj = {
            get age() {
              return 18
            },
            set age(value) {
    先获取原先的描述属性
              let des = Object.getOwnPropertyDescriptor(obj, 'age');
    然后重写一遍 get
              Object.assign(des, {
                get() {
                  return value
                }
    
              });
    更改描述属性
              Object.defineProperty(obj, 'age', des);
            }
    
          }
    
    
    

    发现其实没必要assign

              let obj = {
                get test () {
                  return "mike"
                },
                set test (value) {
                  Object.defineProperty(obj,"test",{
                    get () {
                      return value
                    }
                  });
                }
              }
    

    疑问, set,get 更够被继承吗?

          let a = 18;
          let obj = {
            get test () {
              return a
            },
            set test (value) {
              a = value
            },
            name : 'mike'
          }
          
          let objson = Object.create(obj);
          
          console.log(obj.test);// 18
          obj.test = 22;
          console.log(obj.test);// 22
          console.log(objson.test);// 22
          objson.test = 32;
          console.log(obj.test);// 32
          console.log(objson.test);// 32
    
    1. 表明确实能够继承
    2. 子对象修改 会影响 父对象
    3. 实际上这很奇怪,因为子对象与父对象,共享一个test
    4. 并且你会发现, 子对象无法通过 objson.test 的方式生成自己的属性了.也就是无法覆盖!
    5. 这也是一种神奇的污染.

    再看一下这个

    let _age = 18;
          class aa {
            constructor() {
              this.name = "mike";
            }
            get age () {
              return _age
            }
            set age (value) {
              _age = value
            }
          }
          
          let b = new aa();
          let c = new aa();
    
    let _age = 18;
          class aa {
            constructor() {
              this.name = "mike";
            }
            get age () {
              return _age
            }
            set age (value) {
              _age = value
            }
          }
          
          let b = new aa();
          let c = new aa();
          
          console.log(b.age);/18
          console.log(c.age);/18
          b.age = 20;
          console.log(b.age);/20
          console.log(b.age);/20
          c.age = 30;
          console.log(b.age);/30
          console.log(b.age);/30
    

    从继承的角度上来看, 确实都能继承,
    并且都会影响父级和全部的实例
    问题在于污染了 age 这个属性
    所有的实例无法设置自己专有的 age
    也就是说,一定会影响全部实例.
    所以如果遇到一个属性怎么设置都无法查看,
    有可能就是get set 搞的.

    相关文章

      网友评论

          本文标题:set , get 的一些疑问笔记

          本文链接:https://www.haomeiwen.com/subject/lywlkqtx.html