当前位置:首页 > JavaScript

js实现oberve

2026-03-14 06:54:16JavaScript

js实现oberve

js实现oberve

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

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

使用类实现基础观察者模式

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
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…