字符串匹配与动态绑定Set/Get(String matching and dynamic binding set / get)

字符串匹配与动态绑定Set/Get

<script>
      let template = `
      <template>
        <div>
          {{ emp.name }}
          {{ emp.age }}
          {{ emp.Friends_list }}
          {{ emp.Girlfriends }}
        </div>
      </template>
      `;

      let emp = {
        name: "kyle",
        age: 19,
        Friends_list: [
          {
            name: "杰杰",
            age: 24,
          },
          {
            name: "老刘",
            age: 24,
          },
          {
            name: "明明",
            age: 24,
          },
          {
            name: "小新",
            age: 24,
          },
        ],
        Girlfriends: [
          {
            name: "花花",
            age: 21,
          },
        ],
      };
      function deepBindSet(obj) {
        let newObj = {};
        if (Array.isArray(obj)) newObj = [];
        for (const key in obj) {
          if (obj[key] instanceof Object || 
              obj[key] instanceof Array) {
            newObj[key] = deepBindSet(obj[key]);
          } else {
            console.log(obj[key]);
            Object.defineProperty(newObj, "_" + key, 			{
              writable: true,
              value: obj[key],
            });
            Object.defineProperty(newObj, key, {
              get() {
                return this["_" + key];
              },
              set(nV) {
                console.log(key, nV);
                this["_" + key] = nV;
              },
            });
          }
        }
        return newObj;
      }

      let nv = deepBindSet(emp);
      nv.name = "亮亮";
      // 过滤模板中的关键字
      let args = template.match(/\{[^\}]+\}\}/gi);

      args = args.map((item, index) => {
        let str = item.slice(2, -2).trim();
        let data = eval(str);
        console.log(data);
        return data;
      });
      console.log(args);
</script>
————————

String matching and dynamic binding set / get

<script>
      let template = `
      <template>
        <div>
          {{ emp.name }}
          {{ emp.age }}
          {{ emp.Friends_list }}
          {{ emp.Girlfriends }}
        </div>
      </template>
      `;

      let emp = {
        name: "kyle",
        age: 19,
        Friends_list: [
          {
            name: "杰杰",
            age: 24,
          },
          {
            name: "老刘",
            age: 24,
          },
          {
            name: "明明",
            age: 24,
          },
          {
            name: "小新",
            age: 24,
          },
        ],
        Girlfriends: [
          {
            name: "花花",
            age: 21,
          },
        ],
      };
      function deepBindSet(obj) {
        let newObj = {};
        if (Array.isArray(obj)) newObj = [];
        for (const key in obj) {
          if (obj[key] instanceof Object || 
              obj[key] instanceof Array) {
            newObj[key] = deepBindSet(obj[key]);
          } else {
            console.log(obj[key]);
            Object.defineProperty(newObj, "_" + key, 			{
              writable: true,
              value: obj[key],
            });
            Object.defineProperty(newObj, key, {
              get() {
                return this["_" + key];
              },
              set(nV) {
                console.log(key, nV);
                this["_" + key] = nV;
              },
            });
          }
        }
        return newObj;
      }

      let nv = deepBindSet(emp);
      nv.name = "亮亮";
      // 过滤模板中的关键字
      let args = template.match(/\{[^\}]+\}\}/gi);

      args = args.map((item, index) => {
        let str = item.slice(2, -2).trim();
        let data = eval(str);
        console.log(data);
        return data;
      });
      console.log(args);
</script>