美文网首页程序员
简单的双向绑定Object.defineProperty和Pro

简单的双向绑定Object.defineProperty和Pro

作者: 小鳄鱼的大哥哦 | 来源:发表于2019-02-18 17:16 被阅读5次

    基于Object.defineProperty

    <input type="text" id="ipt1">
    <h2 id="txt1"></h2>
    <script>
      var ipt1 = document.querySelector('#ipt1'),
      txt1 = document.querySelector('#txt1');
    
      const obj1 = {};
      // 劫持obj1的val属性
      Object.defineProperty(obj1, 'val', {
        get: function() {},
        set: function(newVal) {
          ipt1.value = newVal;
          txt1.innerText = newVal;
        }
      });
    
      ipt1.addEventListener('input',function(event) {
        obj1.val = event.target.value;
      });
    </script>
    

    基于Proxy

    <input type="text" id="ipt2">
    <h2 id="txt2"></h2>
    <script>
      var ipt2 = document.querySelector('#ipt2'),
      txt2 = document.querySelector('#txt2');
    
      const obj2 = {
        age: '芳龄18',
        arr: [1, 2]
      }
      // 监听p的属性
      // 新建一个对象p,具有obj2的所有属性-----浅拷贝
      const p = new Proxy(obj2, {
        get(target, key, value) {
          // 返回值
          return target[key];
        },
    
        set(target, key, value) {
          if (key === 'val') {
            ipt2.value = value;
            txt2.innerText = value;
          } else {
            target[key] = value;
          }
        }
      }) 
        ipt2.addEventListener('input',function(event) {
            p.val = event.target.value;
        });
    </script>
    

    Proxy所能够代理的范围

    // 在读取代理对象的原型时触发该操作,比如在执行 Object.getPrototypeOf(proxy) 时。
    handler.getPrototypeOf()
    
    // 在设置代理对象的原型时触发该操作,比如在执行 Object.setPrototypeOf(proxy, null) 时。
    handler.setPrototypeOf()
    
    // 在判断一个代理对象是否是可扩展时触发该操作,比如在执行 Object.isExtensible(proxy) 时。
    handler.isExtensible()
    
    // 在让一个代理对象不可扩展时触发该操作,比如在执行 Object.preventExtensions(proxy) 时。
    handler.preventExtensions()
    
    // 在获取代理对象某个属性的属性描述时触发该操作,比如在执行 Object.getOwnPropertyDescriptor(proxy, "foo") 时。
    handler.getOwnPropertyDescriptor()
    
    // 在定义代理对象某个属性时的属性描述时触发该操作,比如在执行 Object.defineProperty(proxy, "foo", {}) 时。
    handler.defineProperty()
    
    // 在判断代理对象是否拥有某个属性时触发该操作,比如在执行 "foo" in proxy 时。
    handler.has()
    
    // 在读取代理对象的某个属性时触发该操作,比如在执行 proxy.foo 时。
    handler.get()
    
    // 在给代理对象的某个属性赋值时触发该操作,比如在执行 proxy.foo = 1 时。
    handler.set()
    
    // 在删除代理对象的某个属性时触发该操作,比如在执行 delete proxy.foo 时。
    handler.deleteProperty()
    
    // 在获取代理对象的所有属性键时触发该操作,比如在执行 Object.getOwnPropertyNames(proxy) 时。
    handler.ownKeys()
    
    // 在调用一个目标对象为函数的代理对象时触发该操作,比如在执行 proxy() 时。
    handler.apply()
    
    // 在给一个目标对象为构造函数的代理对象构造实例时触发该操作,比如在执行new proxy() 时。
    handler.construct()
    
    
    
    

    相关文章

      网友评论

        本文标题:简单的双向绑定Object.defineProperty和Pro

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