proxy reflect使用

使用Proxy实现观察者模式

// 观察队列
const queueObservers = new Set();

// 观察队列添加方法
const observers = (fn) => queueObservers.add(fn);

// 观察对象
const observable = (obj) =>
  new Proxy(obj, {
    set(target, key, value, receiver) {
      Reflect.set(target, key, value);
      queueObservers.forEach((fn) => fn());
    },
    get(target, key, receiver) {
      queueObservers.forEach((fn) => fn());
      return Reflect.get(target, key);
    },
  });

// 使用规则:
// 观察响应方法
observers(function () {
  console.log('开始观察');
});
// 观察对象(对象可观察化)
const person = observable({
  name: '张三',
  age: 18,
});
person.name = '刘武';
console.log(person.name);

使用proxy实现数组读取负数的索引

const readArray = (arr) =>
  new Proxy(arr, {
    set(target, key, value, receiver) {
      if (Number(key) < 0) {
        Reflect.set(target, Number(key) + target.length, value);
      } else {
        Reflect.set(target, key, value);
      }
    },
    get(target, key, receiver) {
      console.log(Number(key))
      if (Number(key) < 0) {
        return Reflect.get(target, Number(key) + target.length);
      } else {
        return Reflect.get(target, key);
      }
    },
  });

const arr = readArray([1, 2, 4, 5, 6, 7]);
console.log(arr[2]);
const obj = readArray({name:'1'})
console.log(obj.name)

实现生成各种 DOM 节点的通用函数

// 元素
// 属性
// 文本
const createDom = new Proxy(
  {},
  {
    get(target, tag) {
      return function (attrs = {}, ...children) {
        const el = document.createElement(tag); // 创建标签
        for (key in attrs) {
          el.setAttribute(key, attrs[key]); // 设置属性
        }
        for (let child of children) {
          if (typeof child == 'string') {
            child = document.createTextNode(child); // 生成文本节点
          }
          el.appendChild(child);
        }
        return el;
      };
    },
  },
);

const el = createDom.div(
  {
    style:
      'width: 600px;height: 200px;border: 1px solid #000;text-align: center;line-height: 200px;',
  },
  '去百度',
  createDom.a({ href: 'https://www.baidu.com' }, '百度'),
);

document.body.appendChild(el);

reduce

const double = (x) => x + x;
const triple = (x) => 3 * x;
const quadruple = (x) => 4 * x;

// 函数返回函数
const pipe = (...functions) => (input) => functions.reduce((acc, fn) => fn(acc), input);

const multiply6 = pipe(double, triple);

multiply6(6);

将读取属性的操作(get),转变为执行某个函数,从而实现属性的链式操作

const pipe = function (value) {
  const funcStack = [];
  const proxy = new Proxy(
    {},
    {
      get(target, key) {
        if (key === 'get') {
          return funcStack.reduce(function (val, fn) {
            return fn(val);
          }, value);
        }
        funcStack.push(window[key]);
        return proxy;
      },
    },
  );
  return proxy;
};

var double = (n) => n * 2;
var pow = (n) => n * n;

const a = pipe(3).double.pow.get;
console.log(a);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值