-
mvvm原理以及技术衍生
-
Object.defineProperty
// 这是将要被劫持的对象 const data = { name: '', }; function say(name) { if (name === '古天乐') { console.log('给大家推荐一款超好玩的游戏'); } else if (name === '渣渣辉') { console.log('一刀666,元宝掉不停'); } else { console.log('来做我的兄弟'); } } // 遍历对象,对其属性值进行劫持 Object.keys(data).forEach(function(key) { Object.defineProperty(data, key, { enumerable: true, configurable: true, get: function() { console.log('get'); }, set: function(newVal) { // 当属性值发生变化时我们可以进行额外操作 console.log(`大家好,我系${newVal}`); say(newVal); }, }); }); data.name = '渣渣辉';
Object.keys(obj).forEach(key => { Object.defineProperty(obj, key, { // ... }) })
- 不能监听数组的变化
- 必须遍历对象的每个属性
- 必须深层遍历嵌套的对象
let obj = {name:'Joe',age:100} let obj1 = new Proxy(obj,{ get:function(target,key,receiver){ console.log(`get ${key}`) return Reflect.get(target,key,receiver) }, set:function(target,key,value,receiver){ console.log(`set ${key}`) return Reflect.set(target,key,value,receiver) } }) console.log(obj1.name) // get name "Joe" obj1.name="Bob" // set name console.log(obj1.name) // get name "Bob"
缺点:Object.defineProperty的第一个缺陷,无法监听数组变化
区别:
- Proxy可以直接监听对象而非属性
- Proxy直接可以劫持整个对象,并返回一个新对象,不管是操作便利程度还是底层功能上都远强于Object.defineProperty。
- Proxy可以直接监听数组的变化
- Proxy有多达13种拦截方法,不限于apply、ownKeys、deleteProperty、has等等是Object.defineProperty不具备的。
-
mvvm背景下的前端框架的数据维护
状态管理方案(vuex,redux)。
子父组件直接传值
-
数据变化而页面不变
-
前端工具集成(小程序)
自动化测试
-
开启测试链接端口
./cli.bat --auto C:/project/comperny/cz-wechat-app --auto-port 23345