2017-09-08 88 views
0

下面的代碼是javascript obeserver模式,但是當它執行「subject.subscribeObserver(observer1);」時,出現「無法讀取未定義的屬性推送」的錯誤,似乎是我無法訪問subject.observers。爲什麼會發生?在subscribeObserver函數中,我保留this.observers引用,但主題實例仍然無法訪問它。當我使用原型模式但不返回對象模式時,它真的讓我困惑。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); 

回答

0

當我[...]不會返回對象[...]它的工作原理,是百思不得其解。

嗯,你是從你的構造函數返回一個新的對象。這意味着this對象(即您存儲的.observers屬性)完全被遺忘。在subject.subscribeObserver()調用中,該方法中的this指的是subject,即返回的對象。您應該能夠從console.log(this)中看到 - 記錄的對象是具有方法的對象,但沒有數組。

可以把數組中返回的對象:

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

但我會建議只使用原型模式與它的所有好處。