当前位置:首页 > JavaScript

js实现obs

2026-03-15 09:06:48JavaScript

js实现obs

js实现obs

JavaScript 实现 OBS(观察者模式)

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

基本实现

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!');

更实用的实现

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

  subscribe(callback) {
    this.subscribers.add(callback);
    return () => this.unsubscribe(callback);
  }

  unsubscribe(callback) {
    this.subscribers.delete(callback);
  }

  notify(data) {
    this.subscribers.forEach(callback => callback(data));
  }
}

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

const unsubscribe1 = observable.subscribe(data => {
  console.log('Subscriber 1:', data);
});

const unsubscribe2 = observable.subscribe(data => {
  console.log('Subscriber 2:', data);
});

observable.notify('First notification');

unsubscribe1();

observable.notify('Second notification');

支持多种事件类型

class EventEmitter {
  constructor() {
    this.events = {};
  }

  on(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = new Set();
    }
    this.events[eventName].add(callback);
    return () => this.off(eventName, callback);
  }

  off(eventName, callback) {
    if (this.events[eventName]) {
      this.events[eventName].delete(callback);
    }
  }

  emit(eventName, data) {
    if (this.events[eventName]) {
      this.events[eventName].forEach(callback => callback(data));
    }
  }
}

// 使用示例
const emitter = new EventEmitter();

const unsubscribeClick = emitter.on('click', data => {
  console.log('Click event:', data);
});

emitter.on('hover', data => {
  console.log('Hover event:', data);
});

emitter.emit('click', { x: 100, y: 200 });
emitter.emit('hover', { element: 'button' });

unsubscribeClick();

emitter.emit('click', 'This wont be logged');

响应式属性实现

function createReactiveObject(obj) {
  const subscribers = new Map();

  return new Proxy(obj, {
    set(target, property, value) {
      target[property] = value;
      if (subscribers.has(property)) {
        subscribers.get(property).forEach(callback => callback(value));
      }
      return true;
    },
    get(target, property) {
      if (typeof target[property] === 'object' && target[property] !== null) {
        return createReactiveObject(target[property]);
      }
      return target[property];
    }
  });
}

function watchProperty(obj, property, callback) {
  if (!obj._subscribers) {
    obj._subscribers = new Map();
  }
  if (!obj._subscribers.has(property)) {
    obj._subscribers.set(property, new Set());
  }
  obj._subscribers.get(property).add(callback);
  return () => obj._subscribers.get(property).delete(callback);
}

// 使用示例
const state = createReactiveObject({
  user: {
    name: 'John',
    age: 30
  },
  loggedIn: false
});

watchProperty(state.user, 'name', (newName) => {
  console.log('Name changed to:', newName);
});

watchProperty(state, 'loggedIn', (isLoggedIn) => {
  console.log('Login status changed:', isLoggedIn);
});

state.user.name = 'Jane';
state.loggedIn = true;

这些实现展示了JavaScript中观察者模式的不同应用场景,从基础实现到更复杂的响应式系统。根据具体需求可以选择合适的实现方式。

标签: jsobs
分享给朋友:

相关文章

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…