当前位置:首页 > JavaScript

js实现oberve

2026-04-06 00:56:54JavaScript

实现 JavaScript 的观察者模式

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

基本实现方式

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

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 方法以响应通知:

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 可以创建响应式对象,自动触发观察者通知:

js实现oberve

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实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…