• 全部用ts重写(响应式、vdom、模版编译等)
    • 性能提升, 代码量减少
    • 会调整部分API | | Object.defineProperty | Proxy | | —- | —- | —- | | 优点 | | 规避Object.ownPerporty的问题:
      - 深度监听惰性递归(性能提升)
      - 可监听新增/删除 属性
      - 可监听数组变化
      | | 缺点 |
      - 深度监听需要一次性递归到底(计算量大)
      - 无法监听新增属性/删除属性(vue.$set、vue.$delete)
      - 无法原生监听数组, 需要特殊处理
      | 存在浏览器兼容性问题, 且不能ployfill |

    实现响应式

    • 重复数据不监听
    • 新增属性监听
    • 深度监听
    • 性能提升

    优化1,监听数组, 调用原型方法,分布执行get push、get length、set 3 d、set length 4。
    过滤掉get push, 自带原型属性, 无需处理。
    过滤掉set length 4, 在set 3 d中已处理, 无需重复处理。

    1. get(target, key, receiver) {
    2. const ownKeys = Reflect.ownKeys(target)
    3. // 只处理本身(非原型的)属性
    4. if (!ownKeys.includes(key)) {
    5. console.log('get', key)
    6. }
    7. const result = Reflect.get(target, key, receiver)
    8. return result
    9. },
    10. set(target, key, val, receiver) {
    11. // 重复数据不处理
    12. if (val === target[key]) {
    13. return true
    14. }
    15. const result = Reflect.set(target, key, val, receiver)
    16. console.log('set', key, val)
    17. return result
    18. },

    优化2, 监听新增属性(及区分出新增属性)

    1. if (!Reflect.ownKeys(target).includes(key)) {
    2. console.log('new', key)
    3. }

    优化3, 深度监听+性能提升

    1. if (typeof target != 'object' || target == null) {
    2. // 不是对象或数组, 则返回
    3. return target
    4. }
    5. set () {
    6. // 深度监听
    7. return observe(result)
    8. }

    基本用法

    1. const data = {
    2. name: 'Jack',
    3. age: 24
    4. }
    5. const proxyData = new Proxy(data, {
    6. get(target, key, receiver) {
    7. const result = Reflect.get(target, key, receiver)
    8. console.log('get', key)
    9. return result
    10. },
    11. set(target, key, val, receiver) {
    12. const result = Reflect.set(target, key, val, receiver)
    13. console.log('set', key, val)
    14. return result
    15. },
    16. deleteProperty(target, key) {
    17. const result = Reflect.deleteProperty(target, key)
    18. console.log('delete', key)
    19. return result
    20. }
    21. }
    22. console.log(data.name)
    23. proxyData.name
    24. proxyData.name = 'Lucy'
    25. console.log(proxyData)
    26. delete proxyData.age
    27. console.log(proxyData)

    Refect

    • 和Proxy能力—对应
    • 规范化、标准化、函数式
    • 替代掉Object上的工具函数
      1. const data = {
      2. name: 'Jack',
      3. age: 24,
      4. city: 'chengdu'
      5. }
      6. // [ 'name', 'age' ]
      7. console.log(Object.getOwnPropertyNames(data))
      8. console.log(Reflect.ownKeys(data))
      9. // true
      10. console.log('name' in data)
      11. console.log(Reflect.has(data, 'name'))
      12. // delete
      13. delete data.age
      14. Reflect.deleteProperty(data, 'city')
      15. console.log(data)