观察者模式
var observer = {
subscribes: [],
subscribe:function(type,fn){
if (!this.subscribes[type]) {
this.subscribes[type] = [];
}
typeof fn === 'function' && this.subscribes[type].push(fn);
},
publish:function(){
var type = [].shift.call(arguments);
var fns = this.subscribes[type];
if (!fns && !fns.length) {
return;
}
for (let index = 0; index < fns.length; index++) {
fns[index].apply(this,arguments);
}
},
remove:function(type,fn)
{
if (typeof type === 'undefined') {
this.subscribes = [];
return;
}
if (typeof fn === 'undefined') {
fn.length = 0;
return;
}
var fns = this.subscribes[type];
if (!fns && !fns.length) {
return;
}
for (let index = 0; index < fns.length; index++) {
if (fns[index] === fn) {
fns.splice(index,1);
}
}
}
}
function jobListForA(jobs) {
console.log('A', jobs);
}
function jobListForB(jobs) {
console.log('B', jobs);
}
observer.subscribe('job', jobListForA);
observer.subscribe('job', jobListForB);
observer.subscribe('examinationA', function(score) {
console.log(score);
});
observer.subscribe('examinationB', function(score) {
console.log(score);
});
observer.subscribe('interviewA', function(result) {
console.log(result);
});
observer.publish('examinationA', 100);
observer.publish('examinationB', 80);
observer.publish('interviewA', '备用');