当前位置:首页 > JavaScript

js实现oberve

2026-04-06 00:56:54JavaScript

实现 JavaScript 的观察者模式

观察者模式是一种设计模式,允许对象(观察者)订阅另一个对象(被观察者)的状态变化。当被观察者的状态发生变化时,它会通知所有观察者。

基本实现方式

创建一个 Subject 类作为被观察者,维护一个观察者列表并提供订阅和通知功能:

js实现oberve

class Subject {
  constructor() {
    this.observers = [];
  }

  subscribe(observer) {
    this.observers.push(observer);
  }

  unsubscribe(observer) {
    this.observers = this.observers.filter(obs => obs !== observer);
  }

  notify(data) {
    this.observers.forEach(observer => observer.update(data));
  }
}

创建 Observer 类作为观察者,实现 update 方法以响应通知:

js实现oberve

class Observer {
  update(data) {
    console.log(`Received data: ${data}`);
  }
}

使用示例

实例化被观察者和观察者,建立订阅关系并触发通知:

const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();

subject.subscribe(observer1);
subject.subscribe(observer2);

subject.notify('State changed!');

subject.unsubscribe(observer2);
subject.notify('Another change');

基于 Proxy 的实现

利用 ES6 的 Proxy 可以创建响应式对象,自动触发观察者通知:

function createObservable(target, observer) {
  return new Proxy(target, {
    set(obj, prop, value) {
      obj[prop] = value;
      observer.update({ prop, value });
      return true;
    }
  });
}

const observer = {
  update(change) {
    console.log(`Property ${change.prop} set to ${change.value}`);
  }
};

const user = createObservable({}, observer);
user.name = 'John';  // 自动触发观察者通知

实际应用场景

  • 表单输入验证:观察表单字段变化实时验证
  • 状态管理:如 Redux 的 store 订阅机制
  • 事件系统:DOM 事件监听的本质就是观察者模式

注意事项

  • 避免内存泄漏:及时取消不再需要的观察者订阅
  • 考虑通知顺序:观察者被通知的顺序通常是订阅顺序
  • 性能优化:大量观察者时考虑批量通知或节流机制

标签: jsoberve
分享给朋友:

相关文章

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…