2017-09-08 8 views
0

以下のコードはjavascript obeserverパターンですが、 "subject.subscribeObserver(observer1);"を実行すると、 "未定義のプロパティプッシュを読み取ることができません"というエラーが発生します私はsubject.observersにアクセスできません。なぜこれが起こるのですか? subscribeObserver関数ではthis.observersの参照を保持していますが、サブジェクトインスタンスはそれにまだアクセスしていません。私はプロトタイプパターンを使用してオブジェクトパターンを返さない場合、それは本当に困惑しています。Javascript Observerパターンはプライベートプロパティにアクセスできない

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

私は[...]それは動作します[...]オブジェクトを返さない場合は、それは本当に私をパズルです。

はい、コンストラクタから新しいオブジェクトを返しています。つまり、プロパティを格納したthisオブジェクトは完全に忘れています。 subject.subscribeObserver()コールでは、メソッド内のthisは、subject、つまり返されたオブジェクトを参照します。 console.log(this)から見ることができるはずです - ログに記録されたオブジェクトはメソッドを持ちますが配列はありません。

あなた返されたオブジェクトに配列を入れることができます:

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

が、私はちょうどそのすべての利点を持つプロトタイプパターンを使用することをお勧めします。

関連する問題