Vue原理(一)——初始化data属性

let app = new Vue({
    data: {
        text: "text",
        text2: "text2"
    }
})

第一步:
使用observe函数对Vue中的data对象进行处理,使其可观察(observable)。这一步的实质就是使用Object.defineProperty方法重写data的属性,重写属性特征(主要指set和get两个属性特征函数,从而在获取属性值和设置属性值的时候插入额外的操作来实现视图中跟随数据变化):
了解Vue实例化过程做了什么?下面可以看出,Vue实例化的时候,会把传入对象的data属性传递给实例的_data属性,同时,调用observe函数来处理_data也就是option.data。observe函数实质上就是使_data对象的所有属性的set, get。

class Vue {
    constructor(options) {
        this._data = options.data;
        observe(this._data);
    }
}

observe函数具体的实现,其实就是遍历_data中的所有属性,调用defineProperty在set和get来注入取值和设置值时的额外操作。
其中,dep是一个数组,其中存放着依赖于当前属性的观察者列表,也就是属性改变时要通知列表中的这些对象来更新数据。

function observe(obj) {
    Object.keys(obj).forEach((key) => {
        defineReactive(obj, key, obj[key]);
    })
}

// defineReactive函数
function defineReactive(obj, key, value) {
    const dep = [];
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: () => {
            // 读取值时的额外操作,即绑定当前的观察者到依赖列表中
            dep.push(Dep.target);
            return value;
        },
        set: (newVal) => {
            if (newVal === value) { return };
            // 设置值时的额外操作,即设置值时通知依赖列表中的所有观察者来更新数据
            dep.forEach((a) => a.update);
            value = newVal;
        }
    })
}
posted @   lyk_109  阅读(4370)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示