【问题标题】:Javascript Observer pattern can not access private propertyJavascript 观察者模式无法访问私有属性
【发布时间】:2017-09-08 02:08:23
【问题描述】:

下面的代码是javascript obeserver模式,但是在执行“subject.subscribeObserver(observer1);”时,出现“can not read property push of 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);

【问题讨论】:

    标签: javascript design-patterns observer-pattern


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多