数据代理实现的底层

  • 应用Object.defineProperty()

object类型的代理实现

  • 单纯的对象构造

     obj = {   num: 20,   name: 'xx' }
  • 对象嵌套对象的数据结构

     obj = {   name: "xx",   obj: {      num: 20,      age: 33   } }
  • 代码实现

    /** * 代理数据对象 */function getObjKey(obj) {  return Object.keys(obj);}function getNameSpace (nameSpace, key) {  if (key === null || key === "") {      return nameSpace;  }else if(nameSpace === null || nameSpace === "") {      return key  }else {      return nameSpace + "." + key  }}function constructObjProxy (vm, options, nameSpace){  let proxyObj = { };    const optionAllKey = getObjKey(options);  optionAllKey.forEach((key, index) => {    {      /**       * proxyObj对象 代理 options的key       * 目标:监听data对象中的值       */      Object.defineProperty(proxyObj, key, {          configurable: true,          get: function() {              return options[key]          },          set: function(value) {              console.log("proxyObj对象代理——扭转的时候做点什么。。。");              options[key] = value;          }      })    }    {      /**       * vm实例 代理 options的key       * 目标: vm实例能批改data中的指       */      Object.defineProperty(vm, key, {          configurable: true,          get: function() {              return options[key]          },          set: function(value) {              console.log("vm代理key——扭转时候做点什么。。。");              options[key] = value;          }      })    }    // 对象嵌套对象的状况    if(options[key] instanceof Object) {      options[key] = constructProxy(vm, options[key], getNameSpace(nameSpace, key))    }  })  return proxyObj;}/** *  * @param {*} vm 实例对象 * @param {*} options 须要代理的数据对象 * @param {*} nameSpace 命名空间 *  * 仅针对object、Array类型的数据进行代理 */export  function constructProxy(vm, options, nameSpace) {  let proxyObj = null;  if(options instanceof Object) {      proxyObj = constructObjProxy(vm, options, nameSpace)  }else if( options instanceof Array) {  }else {      throw new Error("this is not proxy object");  }  return proxyObj}