0

Please help i m not getting what is mistake in my code. This is regarding observer pattern in js. Getting error "Uncaught TypeError: Cannot read property 'push' of undefined". I think this error is because "observers" key is not created on the object when i used it with new keyword.

Js Fiddle: https://jsfiddle.net/2808w5x0/

function Subject(){
    this.observers = [];

  return {
    subscribeObserver:function(observer){
        observers.push(observer);
    },
    getObservers:function(){return this.observers;},
    unSubscribeObserver:function(observer){
        var index = this.observers.indexof(observer);
      if(index > -1){
        this.observers.splice(index,1);
      }
    },
    notifyObserver:function(observer){
        var index = this.observers.indexof(observer);
      if(index > -1){
        this.observer[index].notify(index);
      }
    },
    notifyAllObserver:function(){
        this.observers.foreach(function(val,idx){
        val.notify(idx);
      });
    }
  };
}

function Observer(){
    return{
    notify:function(idx){
        console.log("Observer " + idx + " notified.");
    }
  }
}

var subject = new Subject();
console.log("subject ",subject.getObservers());
var ob1 = new Observer();
var ob2 = new Observer();
var ob3 = new Observer();
var ob4 = new Observer();

subject.subscribeObserver(ob1);
subject.subscribeObserver(ob2);
subject.subscribeObserver(ob3);
subject.subscribeObserver(ob4);

subject.notifyAllObserver();
niraj17
  • 79
  • 7

1 Answers1

1

Be careful, when creating a new object new Subject() there is an implicit return that provides your new object. You don't need to return your object like you did.


Now, for the methods, you need to attach them to the prototype of the object. That way, when the object is created, it will have those methods attached to it. Ex :

function MySuperObject( value ) {
    this.property = value;
};

MySuperObject.prototype.attachedMethod = function() {
    console.log("Property is equal to : " + this.property) + ".";
};

// The object is implicitly returned and stored in <myobj>.
var myobj = new MySuperObject(0);

// Result : Property is equal to : 0.
myobj.attachedMethod();

And so, your code must be written as :

function Subject(){
  this.observers = [];
}

Subject.prototype.subscribeObserver = function( observer ) {
  this.observers.push(observer);
};

Subject.prototype.getObservers = function() {
  return "There are " + this.observers.length + " observers.";
};

function Observer(){
  // ...
}

var subject = new Subject();
console.log("subject ",subject.getObservers());

var ob1 = new Observer();
var ob2 = new Observer();
var ob3 = new Observer();
var ob4 = new Observer();
subject.subscribeObserver(ob1);
subject.subscribeObserver(ob2);
subject.subscribeObserver(ob3);
subject.subscribeObserver(ob4);

// Or you could simply do :
// for(var i=0; i<4; i++) {
//     subject.subscribeObserver(new Observer());
// }

console.log("subject ",subject.getObservers());

Hope it helps!

Bird
  • 572
  • 5
  • 15