//声明主题对象 var Subject = function(name) { this.name = name this.register = [] } Subject.prototype = { //注册观察者 submit(observe) { this.register.push(observe) console.log('观察者' + observe.id + '订阅了本主题') return this }, //观察者取关 unsubmit(observe) { var that = this this.register.map(function(name, index) { if (name == observe) { that.register.splice(index, 1) console.log(name.id + '取关了本主题') } }) return this }, //在某些特定的时候,由主题向所有的订阅者发布事件 radioOn(name, value) { this.register.map(rg => { rg[name](value) }) return this } } var Observe = function(id) { this.id = id } //供主题调用的事件 Observe.prototype = { updata(msg) { console.log('观察者' + this.id + '更新了信息,信息为' + msg) }, init() { console.log('观察者' + this.id + '进行了初始化') }, play(type) { console.log('观察者' + this.id + '开始玩起了' + type) } } //实例化一个主题 var subject1 = new Subject('PUBG') //实例化三个观察者对象 var observe1 = new Observe('张三') var observe2 = new Observe('李四') var observe3 = new Observe('赵六') subject1.submit(observe1) .submit(observe2) .radioOn('init') .radioOn('updata', '天命圈hhh') .unsubmit(observe1) .submit(observe3) .radioOn('play', subject1.name) /* 观察者张三订阅了本主题 * 观察者李四订阅了本主题 * 观察者张三进行了初始化 * 观察者李四进行了初始化 * 观察者张三更新了信息,信息为天命圈hhh * 观察者李四更新了信息,信息为天命圈hhh * 张三取关了本主题 * 观察者赵六订阅了本主题 * 观察者李四开始玩起了PUBG * 观察者赵六开始玩起了PUBG */