本文以Vue.js为例解析MVVM模式,阐述View、Model与ViewModel的职责划分。重点讲解如何利用Object.defineProperty的get和set方法实现数据劫持,从而在数据改变时自动更新DOM,无需手动操作节点,实现View与ViewModel的双向绑定。
MVVM模式概述
本文以Vue.js框架为例,探讨其采用的MVVM设计模式。

View与Model定义
View(视图层)由页面的HTML结构和CSS样式共同构成,负责用户界面的展示。
Model(模型层)指从后端接口获取并存储的数据模型,代表应用的状态数据。
ViewModel层职责
ViewModel(视图模型层)由前端开发人员构建,用于组织、生成和维护视图数据。该层核心包含视图行为逻辑与具体数据。
视图行为涵盖页面加载时的数据请求、将指定数据渲染至特定元素,以及点击元素触发事件等交互逻辑。当ViewModel完成数据处理后,会将对应数据同步展示至View层。
双向绑定优势
MVVM模式的核心优势在于View与ViewModel之间的双向绑定机制。当底层数据发生改变时,系统无需手动修改DOM结构,即可自动更新视图。
以原生JavaScript实现input值与div文本的双向绑定为例,传统方式需监听input事件,每次输入改变时手动触发对div节点文本子节点的修改。而采用MVVM模式后,系统可自动检测数据变化并更新div文本,简化了开发流程。
实现原理:Object.defineProperty
MVVM模式的实现原理主要依赖JavaScript中的Object.defineProperty()方法。该方法提供了get和set两个属性访问器,用于拦截对象属性的读取与赋值操作,从而获取属性值或在属性重新赋值时执行自定义逻辑。
//定义一个对象
let obj = {}
Object.defineProperty(obj,'txt'{
//obj.txt属性赋值方法,同时为input、p文本赋同一个值
set(val){
document.getElementById('input').value = val
document.getElementById('output').innerHTML = val
},
//获取txt属性的方法
get(){
return obj;
}
})
//监听事件 触发的时候会给obj.txt重新赋值,从而实现双向绑定
document.addEventListener('keyup',(e)=>{
obj.txt = e.target.value;
})