Javascript Observer模式无法访问私有属性

时间:2017-09-08 02:08:24

标签: javascript design-patterns observer-pattern

下面的代码是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);

1 个答案:

答案 0 :(得分:0)

  

当我[...]没有返回对象时它起作用,这真的让我很困惑。

是的,您正在从构造函数中返回一个新对象。这意味着this对象(存储了.observers属性的对象)完全被遗忘。在subject.subscribeObserver()调用中,方法中的this引用subject,即返回的对象。您应该能够从console.log(this)看到 - 已记录的对象是带有方法的对象,但没有数组。

可以将数组放在返回的对象上:

function Subject() {
    return {
        observers: [],
        subscribeObserver(observer) {
            …
        },
        …
    };
}

但我建议只使用原型模式及其所有好处。