【问题标题】:javascript observer pattern help in my code我的代码中的 javascript 观察者模式帮助
【发布时间】:2017-09-06 11:18:34
【问题描述】:

请帮助我没有得到我的代码中的错误。这是关于 js 中的观察者模式。收到错误“未捕获的类型错误:无法读取未定义的属性‘push’”。我认为这个错误是因为当我将它与 new 关键字一起使用时,没有在对象上创建“observers”键。

Js 小提琴: 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();

【问题讨论】:

  • 还请说明问题所在。您必须指定需要帮助的问题陈述。
  • 我很抱歉。编辑了帖子。
  • 应该observers.push(observer); 不是this.observers.push(observer);

标签: javascript observer-pattern


【解决方案1】:

小心,当创建一个新对象new Subject() 时,有一个隐含的return 提供您的新对象。你不需要像以前那样返回你的对象。


现在,对于方法,您需要将它们附加到对象的原型。这样,当创建对象时,它会附加这些方法。例如:

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

所以,你的代码必须写成:

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

希望对你有帮助!

【讨论】:

  • 谢谢哥们。我已经更新了 jsfiddle 中的代码,现在运行良好。
猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
相关资源
最近更新 更多