首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript观察者模式无法访问私有属性

Javascript观察者模式无法访问私有属性
EN

Stack Overflow用户
提问于 2017-09-08 10:08:24
回答 1查看 110关注 0票数 0

下面的代码是javascript obeserver模式,但当它执行"subject.subscribeObserver(observer1);“时,出现错误"can not read property push of undefined",似乎无法访问subject.observers。这一切为什么要发生?在subscribeObserver函数中,我保留了this.observers引用,但subject实例仍然无法访问它。当我使用prototype模式而不是return object模式时,这真的让我感到困惑。

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2017-09-08 12:12:31

When I…不返回对象…它起作用了,这真的让我很困惑。

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

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

代码语言:javascript
复制
function Subject() {
    return {
        observers: [],
        subscribeObserver(observer) {
            …
        },
        …
    };
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46107597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档