下面的代码是javascript obeserver模式,但当它执行"subject.subscribeObserver(observer1);“时,出现错误"can not read property push of undefined",似乎无法访问subject.observers。这一切为什么要发生?在subscribeObserver函数中,我保留了this.observers引用,但subject实例仍然无法访问它。当我使用prototype模式而不是return object模式时,这真的让我感到困惑。
var Subject = function() {
this.observers = [];
return {
subscribeObserver: function(observer) {
console.log(this);
this.observers.push(observer);
},
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.observers[index].notify(index);
}
},
notifyAllObservers: function() {
for (var i = 0; i < this.observers.length; i++) {
this.observers[i].notify(i);
};
}
};
};
var Observer = function() {
return {
notify: function(index) {
console.log("Observer " + index + " is notified!");
}
}
}
var subject = new Subject();
var observer1 = new Observer();
var observer2 = new Observer();
var observer3 = new Observer();
var observer4 = new Observer();
subject.subscribeObserver(observer1);发布于 2017-09-08 12:12:31
When I…不返回对象…它起作用了,这真的让我很困惑。
是的,你从你的构造函数返回一个新的对象。这意味着完全忘记了存储.observers属性的this对象。在subject.subscribeObserver()调用中,方法中的this引用subject,即返回的对象。您应该能够从console.log(this)中看到这一点--记录的对象是有方法的对象,但没有数组。
您可以将数组放在返回的对象上:
function Subject() {
return {
observers: [],
subscribeObserver(observer) {
…
},
…
};
}但我建议只使用prototype模式及其所有优点。
https://stackoverflow.com/questions/46107597
复制相似问题