Observer & Singleton Patterns

What is the proper way to handle memory management in the Observer Pattern?
class WeakSubject {
  constructor() {
    this.observers = new WeakSet();
  }

  subscribe(observer) {
    if (typeof observer !== 'object' || observer === null) {
      throw new Error('Observer must be an object');
    }
    this.observers.add(observer);
  }

  notify(data) {
    // Convert WeakSet to array for iteration
    const currentObservers = Array.from(this.observers);
    currentObservers.forEach(observer => {
      if (observer.update) {
        observer.update(data);
      }
    });
  }
}
Next Question (14/15)