2017-09-06 1 views
0

私のコードで何が間違っているのか分かりません。これはjsのオブザーバパターンに関するものです。エラーを取得する "Uncaught TypeError:未定義のpush 'プロパティを読み取ることができません。私は、このエラーは、私が新しいキーワードでそれを使用したときにオブジェクト上に「オブザーバー」キーが作成されないためだと思います。javascriptオブザーバのパターンヘルプでコード

Jsのフィドル:新しいオブジェクトnew Subject()を作成するときに 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(observer);' this.observers.push(observer);ではない ' – Rajesh

答えて

0

は注意してください、あなたの新しいオブジェクトを提供して暗黙の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

Thanks Buddy。 jsfiddleのコードを更新しました。 – niraj17

関連する問題