下面的代码是javascript obeserver模式,但是当它执行" subject.subscribeObserver(observer1);"时,会发生错误,"无法读取undefined"的属性推送,似乎我无法访问subject.observers。为什么会这样?在subscribeObserver函数中,我保留this.observers引用,但主题实例仍然无法访问它。当我使用原型模式但没有返回对象模式时,它就起作用了,这真让我感到困惑。
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);
答案 0 :(得分:0)
当我[...]没有返回对象时它起作用,这真的让我很困惑。
是的,您正在从构造函数中返回一个新对象。这意味着this
对象(存储了.observers
属性的对象)完全被遗忘。在subject.subscribeObserver()
调用中,方法中的this
引用subject
,即返回的对象。您应该能够从console.log(this)
看到 - 已记录的对象是带有方法的对象,但没有数组。
你可以将数组放在返回的对象上:
function Subject() {
return {
observers: [],
subscribeObserver(observer) {
…
},
…
};
}
但我建议只使用原型模式及其所有好处。