响应化是MVVM模式中的一个重要组成部分,对数据的操作有了响应才有下一步根据响应做对应操作的机会
对象属性响应化处理
| |
| function reactiveObject(obj, key, val) { |
| |
| observe(val); |
| Object.defineProperty(obj, key, { |
| get() { |
| console.log("get 属性: ", key, " 值: ", val); |
| return val; |
| }, |
| set(newVal) { |
| if (newVal !== val) { |
| |
| observe(newVal); |
| console.log("set 属性: ", key, " 值: ", newVal); |
| newVal = val; |
| } |
| }, |
| }); |
| } |
数组响应化处理
| |
| function reactiveArray() { |
| |
| const orgArrayProto = Array.prototype; |
| |
| const reactiveArrayProto = Object.create(orgArrayProto); |
| ["push", "pop", "shift", "unshift", "splice", "sort", "reverse"].forEach( |
| (method) => { |
| reactiveArrayProto[method] = function() { |
| |
| orgArrayProto[method].apply(this, arguments); |
| |
| console.log("数组操作: method: ", method, " arguments: ", arguments); |
| }; |
| } |
| ); |
| return reactiveArrayProto; |
| } |
执行统一响应化处理
| |
| function observe(obj) { |
| if (typeof obj !== "object" || obj == null) { |
| return; |
| } |
| if (Array.isArray(obj)) { |
| |
| |
| obj.__proto__ = reactiveArray(); |
| for (let i = 0; i < obj.length; i++) { |
| observe(obj[i]); |
| } |
| } else { |
| |
| Object.keys(obj).forEach((key) => reactiveObject(obj, key, obj[key])); |
| } |
| } |
TEST
| const person = { |
| name: "小明", |
| age: 18, |
| email: ["111@qq.com"], |
| address: { city: "bj" }, |
| }; |
| |
| observe(person); |
| |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)