set , get 的一些疑问笔记

2018-12-18  本文已影响0人  wudimingwo

一个疑问
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 搞的.

上一篇下一篇

猜你喜欢

热点阅读