数据劫持和数据代理
数据劫持 defineProperty
- 属性介绍
- enumerable: true
- 用来指定属性 是否可以被枚举
- 枚举 通过遍历能够拿到数据
- writable: true
- 用来决定属性值是否可以被修改
- configurable:true,
- 用来决定属性值是否可以被删除
- enumerable: true
- 写法:js
Object.defineProperty(obj, 'hobby', { value: '打篮球', // enumerable: true, // writable: true, // configurable:true, get() { console.log('你正在尝试获取数据') return hob }, set(value) { console.log('你正在尝试修改数据', value) hob = value } })
- 取对象的键
Object.keys("取键名的对象“)
proxy 数据代理
vue3 原理 新的语法 proxy
通过代理把数据拿到
get 方法 需要两个参数
- target: 目标
- prop: 目标中的属性
set 方法接收三个参数
- target:目标对象
- prop: 目标对象中的属性
- value: 修改的数据
写法:
jsvar data = { username: 'zs', age: '20' } var vm = new Proxy(data, { get(target, prop) { console.log('target:', target) console.log('prop:', prop) return target[prop] }, set(target, prop, value) { console.log('target:', target) console.log('prop:', prop) console.log('value:', value) target[prop] = value } }) console.log(vm)
练习
console.log(obj.num, obj.num, obj.num) // 1, 2, 3
思路:
- 每次获取的值是不一样的
- 在获取本次数据的时候需要把下一次的数据修改一下
写法:
jsvar object = { num: 1 } var obj = new Proxy(object, { get(target, prop) { return target[prop]++ } }) console.log(obj.num, obj.num, obj.num) // 1,2,3