Proxy

Object.defineProperty

使用语法

// 第一种
let person = {}
Object.defineProperty(person, 'name', {
  configurable: true, // 是否允许配置修饰符
  enumerable: true // 是否可被枚举
  value: '张三',
  writerable: true, // 设置为false时,赋值不会报错,只是设置不成功
})

// 第二种
let person = {}
Object.defineProperty(person, 'name', {
  configurable: true,
  enumerable: true,
  get: function() {
    return '张三'
  },
  set: function(val) {
    cosnole.log('设置时传入的值', val)
  }
})

响应式原理

主要是在set出发的时候,去更新视图。

// html
<div id="name">小子</div>
<div id="btn">按钮</div>

// js
let person = {}
let val = 小子 // 记录当前的值
Object.defineProperty(person, 'name', {
  set: function(newVal) {
    document.getElementById('name').innerHTML = newVal
    val = newVal
  }
})

document.getElementById('btn').addEventListener('click', () => {
  person.name = '老子'
})

将以上代码封装成一个watch函数

// 功能
let person = {
  name: '张三'
}
watch(person, 'name', function(newVal) {
  document.getElementById('name').innerHTML = newVal
})
document.getElementById('btn').addEventListener('click', function() {
  person.name = '李四'
})

function watch(obj, key, cb) {
  let val = obj[key]
  Object.defineProperty(obj, 'name', {
    get: function() {
      return val
    },
    set: function(newVal) {
      cb(newVal)
      val = newVal
    }
  })
}

proxy

什么是Proxy

可以定义一个对象的各种属性、行为、函数等等一系列自定义操作。

使用方法

let person = new Proxy({}, {
  get: function(target, key) {
    
  },
  set: function(target, key, newVal) {
  
  },
  has: function() {

  },
  // 函数被调用时拦截,注意传入target是函数。 arguments => 被调用时传入的参数数组
  apply: function(target, content, arguments) {

  }
})
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 来自深入理解ES6第十二章,由于最近业务中经常用到,记录一下 这里内容都太学术了,有一篇简单介绍Proxy作用的文...
    NowhereToRun阅读 4,615评论 0 1
  • Proxy 概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(met...
    pauljun阅读 8,416评论 0 1
  • 不久前,也就是11月14日-16日于多伦多举办的 VueConf TO 2018 大会上,尤雨溪发表了名为 Vue...
    Cryptic阅读 46,246评论 3 36
  • 渤海湾的海,是深蓝的,冷清的,忧郁的。 冰冷的海水温度,虾兵蟹将们冻得瑟瑟发抖,个头长得缓慢,生长周期也长了起来。...
    神楽_阅读 4,675评论 3 3