javascript 观察者模式对我的代码有帮助
javascript observer pattern help in my code
请帮助我没有发现我的代码有什么错误。这是关于js中的观察者模式。获取错误 "Uncaught TypeError: Cannot read property 'push' of undefined"。我认为此错误是因为当我将它与 new 关键字一起使用时,未在对象上创建 "observers" 键。
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();
请注意,在创建新对象时 new Subject()
有一个隐含的 return
提供您的新对象。您不需要像以前那样 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());
希望对您有所帮助!
请帮助我没有发现我的代码有什么错误。这是关于js中的观察者模式。获取错误 "Uncaught TypeError: Cannot read property 'push' of undefined"。我认为此错误是因为当我将它与 new 关键字一起使用时,未在对象上创建 "observers" 键。
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();
请注意,在创建新对象时 new Subject()
有一个隐含的 return
提供您的新对象。您不需要像以前那样 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());
希望对您有所帮助!