2017-09-06 30 views
0

請幫助我沒有得到什麼是我的代碼中的錯誤。這是關於js中的觀察者模式。獲取錯誤「Uncaught TypeError:無法讀取未定義的屬性」推送「。我認爲這個錯誤是因爲當我用新的關鍵字使用它時,沒有在對象上創建「觀察者」鍵。javascript觀察者模式幫助我的代碼

的js小提琴: https://jsfiddle.net/2808w5x0/

function Subject(){ 
    this.observers = []; 

    return { 
    subscribeObserver:function(observer){ 
     observers.push(observer); 
    }, 
    getObservers:function(){return this.observers;}, 
    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.observer[index].notify(index); 
     } 
    }, 
    notifyAllObserver:function(){ 
     this.observers.foreach(function(val,idx){ 
     val.notify(idx); 
     }); 
    } 
    }; 
} 

function Observer(){ 
    return{ 
    notify:function(idx){ 
     console.log("Observer " + idx + " notified."); 
    } 
    } 
} 

var subject = new Subject(); 
console.log("subject ",subject.getObservers()); 
var ob1 = new Observer(); 
var ob2 = new Observer(); 
var ob3 = new Observer(); 
var ob4 = new Observer(); 

subject.subscribeObserver(ob1); 
subject.subscribeObserver(ob2); 
subject.subscribeObserver(ob3); 
subject.subscribeObserver(ob4); 

subject.notifyAllObserver(); 
+0

請再提一下有什麼不對。你將不得不指定你需要幫助的問題陳述。 – Rajesh

+0

我的歉意。編輯帖子。 – niraj17

+0

應該'observers.push(觀察員);'不是'this.observers.push(觀察員);' – Rajesh

回答

0

要小心,創建一個新的對象new Subject()時,有一個隱含的return,提供您的新對象。你不需要像你那樣返回你的對象。


現在,對於這些方法,你需要將它們連接到原型對象的。這樣,當對象被創建時,它將具有附加到它的那些方法。例如:

function MySuperObject(value) { 
    this.property = value; 
}; 

MySuperObject.prototype.attachedMethod = function() { 
    console.log("Property is equal to : " + this.property) + "."; 
}; 

// The object is implicitly returned and stored in <myobj>. 
var myobj = new MySuperObject(0); 

// Result : Property is equal to : 0. 
myobj.attachedMethod(); 

所以,你的代碼必須被寫爲:

function Subject(){ 
 
    this.observers = []; 
 
} 
 

 
Subject.prototype.subscribeObserver = function(observer) { 
 
    this.observers.push(observer); 
 
}; 
 

 
Subject.prototype.getObservers = function() { 
 
    return "There are " + this.observers.length + " observers."; 
 
}; 
 

 
function Observer(){ 
 
    // ... 
 
} 
 

 
var subject = new Subject(); 
 
console.log("subject ",subject.getObservers()); 
 

 
var ob1 = new Observer(); 
 
var ob2 = new Observer(); 
 
var ob3 = new Observer(); 
 
var ob4 = new Observer(); 
 
subject.subscribeObserver(ob1); 
 
subject.subscribeObserver(ob2); 
 
subject.subscribeObserver(ob3); 
 
subject.subscribeObserver(ob4); 
 

 
// Or you could simply do : 
 
// for(var i=0; i<4; i++) { 
 
//  subject.subscribeObserver(new Observer()); 
 
// } 
 

 
console.log("subject ",subject.getObservers());

希望它能幫助!

+0

感謝Buddy。我已經更新了jsfiddle中的代碼,現在它運行良好。 – niraj17