0
나는 자바 스크립트로 코드하는 법을 배웁니다. 나는 항상 오류가 있습니다 : "정의되지 않은 속성 'filter'를 읽을 수 없습니다. 내가 왜 여기서 잘못하고 왜?배열에 필터 함수를 사용할 수 없습니다
A 클래스의 옵저버가 될 싱글 톤 패턴과 B 클래스로 A 클래스를 빌드해야합니다. B 클래스의 인스턴스를 구독자 (옵저버)로 A 클래스에 추가하고 A 클래스의 임의 값 I가 B 클래스의 임의 값 P보다 큰 경우이를 구독 취소해야합니다.
var A = (function()
{
// Instance stores a reference to the Singleton
var instance;
function init() {
// Singleton
var i = 0;
let observers = new Array();
function CheckIfGreaterThanI(observer)
{
console.log("CHECKING");
return observer.getP() > this.getI();
}
return {
subscribe: function(observer)
{
console.log("DODAJĘ");
observers.push(observer);
},
unsubscribe: function(observerss)
{
console.log("USUWAM");
for(i=0;i<observerss.length;i++)
{
var index = this.observers.indexOf(observerss[i])
if (~index)
{
this.observers.splice(index, 1);
}
}
},
notify: function()
{
for(let observer of observers)
{
observer.update();
}
},
getI: function()
{
return this.i;
},
setI: function(value)
{
this.i = value;
this.notify();
///THAT'S THE PLACE WHERE ERROR RISES
var observersToUnsubscribe = this.observers.filter(this.CheckIfGreaterThanI);
this.unsubscribe(observersToUnsubscribe);
}
};
};
return
{
// Get the Singleton instance if one exists
// or create one if it doesn't
getInstance: function() {
if (!instance) {
instance = init();
}
return instance;
}
};
})();
function B (name,value,a) //observer
{
this.Name = name;
this.P = value;
this.A = a;
}
B.prototype =
{
constructor:B,
getName : function()
{
return this.Name;
},
getP : function()
{
return this.P;
},
update : function()
{
if(A.getInstance().getI()<this.P)
{
console.log("OK - " + this.Name);
}
}
};
for(i=0;i<10;i++)
{
var bObject = new B(i,Math.random(),A.getInstance());
A.getInstance().subscribe(bObject);
}
var ChangeIValue = function()
{
A.getInstance().setI(Math.random());
}
setTimeout(function run()
{
ChangeIValue();
setTimeout(run,1000);
}
, 1000);
모든 것이 여기에있다. 필터 제외. –
@SagarV "setI"방법에 있음 – Terrykk
'this.observers'가 어디에 정의되어 있다고 생각합니까? 그 속성은'this'의 어느 곳에서도 생성되지 않습니다. – Bergi