Vue源码解析之(computed&watch&观察者模式)

本文从观察者模式出发,详细解释Vue中computed和watch的实现原理,通过代码示例展示了如何定义Dep、Watcher和Observer,以及在Vue类中如何初始化这些概念,最后通过测试验证了其工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:好久没写博客了,今年确实有点小忙,学习跟工作都很充实,身边也有小伙伴也经常说:技术是学不完的,能不能专一搞点自己喜欢的东西呢?学完新技术然后过几年又没了,岂不是白学了呢? 哈哈~ 说的确定有一点道理啊,但是没办法啊,新技术还是得去了解啊,至少要去看看别人的文档跟设计思想吧,也不怕小伙伴笑哈,最近还在补js跟css基础知识,学无止境,加油吧~骚年!

前面有写过两篇vue的源码的文章,有兴趣的童鞋可以去看看,Vue源码解析(一)Vue源码解析二(render&mount)接触vue也有蛮长一段时间了,不得不说,vue的设计思想跟整体架构还是很牛逼的,所以带着崇拜跟学习的心态我们一起看看vue的computed跟watch属性。

一、观察者模式

在说computed跟watch之前,我们先来认识一种设计模式 “观察者模式”,观察者模式分为“Subject主题”、"Observer观察者 ",在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

字面意思比较抽象,我们直接上代码,还记得在大学的时候老师就讲过“观察者模式”,虽然举的例子不很贴切,但是还算是比较好的诠释,老师跟我们讲了一个 “小美与她的两个男盆友” 的故事。

第一步:定义subject

export default class Subject {
   
    constructor(name,desc) {
   
        this.name = name;
        this.desc = desc;
    }
    add() {
   
        throw new Error("this method should be overrided!!");
    }

    notify() {
   
        throw new Error("this method should be overrided!!");
    }

    cry() {
   
        throw new Error("this method should be overrided!!");
    }
}

第二步:定义Observer

export default class Observer {
   
    constructor(name,desc) {
   
        this.name = name;
        this.desc = desc;
    }

    say() {
   
        throw new Error("this method should be overrided!!");
    }
}

第三步:定义具体的subject对象(girl女孩)

import ISubject from './Subject';

export default class Girl extends ISubject {
   
    constructor(name, desc) {
   
        super(name, desc);
        this.boys = [];
    }

    add(boy) {
   
        this.boys.push(boy);
    }

    notify() {
   
        this.boys.forEach((boy) => {
   
            boy.say();
        });
    }

    cry() {
   
        console.log(this.name + " : " + this.desc);
        this.notify();
    }
}

第四步:定义具体的observer对象(boy男孩)

import Observer from './Observer';

export default class Boy extends Observer {
   
    constructor(name, desc) {
   
        super(name, desc);
    }

    say() {
   
        console.log(this.name + ": " + this.desc);
    }
}

测试:

import Girl from './Girl';
import Boy from './Boy';

const girl1 = new Girl("小美", "今天心情很不好,哄不好的那种~");

const boy1 = new Boy("小黑", "亲爱的,你购物车需要清一下了!");
const boy2 = new Boy("小白", "Darling 逛街去!");

girl1.add(boy1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值