当前位置:首页 > JavaScript

js实现oberve

2026-03-14 06:54:16JavaScript

实现观察者模式(Observer Pattern)的 JavaScript 方法

观察者模式是一种设计模式,允许对象(观察者)订阅另一个对象(被观察者)的状态变化。以下是几种实现方式:

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));
  }
}

class Observer {
  update(data) {
    console.log('Observer received:', data);
  }
}

// 使用示例
const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();

subject.subscribe(observer1);
subject.subscribe(observer2);
subject.notify('Hello Observers!');

使用函数和对象实现轻量级观察者

function createSubject() {
  const observers = [];

  return {
    subscribe: (fn) => observers.push(fn),
    unsubscribe: (fn) => {
      const index = observers.indexOf(fn);
      if (index > -1) observers.splice(index, 1);
    },
    notify: (data) => observers.forEach(fn => fn(data))
  };
}

// 使用示例
const subject = createSubject();

const observer1 = data => console.log('Observer 1:', data);
const observer2 = data => console.log('Observer 2:', data);

subject.subscribe(observer1);
subject.subscribe(observer2);
subject.notify('Data update');

使用 Proxy 实现响应式观察

function createReactiveObserver(target) {
  const observers = new Map();

  return new Proxy(target, {
    set(obj, prop, value) {
      obj[prop] = value;
      if (observers.has(prop)) {
        observers.get(prop).forEach(fn => fn(value));
      }
      return true;
    },
    subscribe(prop, fn) {
      if (!observers.has(prop)) {
        observers.set(prop, []);
      }
      observers.get(prop).push(fn);
    },
    unsubscribe(prop, fn) {
      if (observers.has(prop)) {
        const fns = observers.get(prop);
        const index = fns.indexOf(fn);
        if (index > -1) fns.splice(index, 1);
      }
    }
  });
}

// 使用示例
const state = createReactiveObserver({ count: 0 });

state.subscribe('count', (value) => {
  console.log('Count changed:', value);
});

state.count = 1; // 自动触发观察者

使用 ES6 的 Set 优化观察者存储

class Observable {
  constructor() {
    this.observers = new Set();
  }

  subscribe(fn) {
    this.observers.add(fn);
  }

  unsubscribe(fn) {
    this.observers.delete(fn);
  }

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

// 使用示例
const observable = new Observable();

const logData = data => console.log('Data:', data);
observable.subscribe(logData);
observable.notify('Test message');
observable.unsubscribe(logData);

这些方法展示了 JavaScript 中实现观察者模式的不同方式,从基础的类实现到更高级的 Proxy 方法。选择哪种实现取决于具体需求和项目复杂度。

标签: jsoberve
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现选题

js实现选题

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

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…