标签:全局 cal 这一 引用 eve wow 事件 闭包 pre
//人的构造函数 function Person(name){ this.name=name; //首次创建实例时,为Person的原型添加共有的方法 if(!Person.prototype.sleep){ //人共有的方法 Person.prototype.sleep=function(){ console.log(this.name+‘睡着了‘); } Person.prototype.wake=function(){ console.log(this.name+‘惊醒了‘); } } } //小偷的构造函数 function Thief(name){ this.name=name; //首次创建实例时,为Thief的原型添加共有的方法 if(!Thief.prototype.steal){ Thief.prototype.steal=function(){ console.log(this.name+‘在偷东西‘); } Thief.prototype.escape=function(){ console.log(this.name+‘逃跑了‘); } } } //狗的构造函数 function Dog(name){ this.name=name; //首次创建实例时,为Dog的原型添加共有的方法 if(!Dog.prototype.wow){ Dog.prototype.wow=function(){ console.log(this.name+‘汪!汪!汪!‘); } } }
//创建一个变量将来存储回调函数的引用 var callback=null; //小偷的构造函数 function Thief(name){ this.name=name; //首次创建实例时,为Thief的原型添加共有的方法 if(!Thief.prototype.steal){ Thief.prototype.steal=function(){ console.log(this.name+‘在偷东西‘); //添加了回调函数 if(callback){ callback(); } } Thief.prototype.escape=function(){ console.log(this.name+‘逃跑了‘); } } } var gaofei=new Thief(‘高飞‘); callback=function(){ console.log(‘旺财叫了‘); } gaofei.steal(); //控制台结果: 高飞在偷东西 旺财叫了
function Thief(name){ var callback=null; return (function(){ this.name=name; //首次创建实例时,为Thief的原型添加共有的方法 if(!Thief.prototype.steal){ Thief.prototype.steal=function(){ console.log(this.name+‘在偷东西‘); //添加了回调函数 if(callback){ callback(); } } Thief.prototype.escape=function(){ console.log(this.name+‘逃跑了‘); } //添加事件监听的方法 Thief.prototype.eventListener=function(fn){ callback=fn; } } }).call(this); } var gaofei=new Thief(‘高飞‘); gaofei.eventListener(function(){ console.log(‘旺财叫了‘); }) gaofei.steal(); var difei=new Thief(‘低飞‘); difei.eventListener(function(){ console.log(‘大黄叫了‘); }) difei.steal(); //控制台结果: 高飞在偷东西 旺财叫了 // 低飞在偷东西 大黄叫了 可以看到上面两个实例拥有了自己独有的callback变量 但是还有缺陷: callback是一个变量,只能存储一个函数地址,所以最多只能绑定一个回调函数,正常的需求是能够绑定多个函数; 解决方案: 将callback定义为一个数组 function Thief(name){ var callback=[]; return (function(){ this.name=name; //首次创建实例时,为Thief的原型添加共有的方法 if(!Thief.prototype.steal){ Thief.prototype.steal=function(){ console.log(this.name+‘在偷东西‘); //添加了回调函数 callback.forEach(function(fn,index){ fn(); }) } Thief.prototype.escape=function(){ console.log(this.name+‘逃跑了‘); } //添加事件监听的方法 Thief.prototype.eventListener=function(fn){ callback.push(fn); } } }).call(this); } var gaofei=new Thief(‘高飞‘); gaofei.eventListener(function(){ console.log(‘旺财叫了‘); }); gaofei.eventListener(function(){ console.log(‘大黄也叫了‘); }) gaofei.steal(); //控制台结果:高飞在偷东西 // 旺财叫了 // 大黄也叫了
function Thief(name){ var callback={}; return (function(){ this.name=name; //首次创建实例时,为Thief的原型添加共有的方法 if(!Thief.prototype.steal){ Thief.prototype.steal=function(){ console.log(this.name+‘在偷东西‘); //如果callback.steal存在,则执行里面的回调函数 if(callback.steal){ callback.steal.forEach(function(fn,index){ fn(); }) } } Thief.prototype.escape=function(){ console.log(this.name+‘逃跑了‘); //如果callback.escape存在,则执行里面的回调函数 if(callback.escape){ callback.escape.forEach(function(fn,index){ fn(); }) } } //添加事件监听的方法 Thief.prototype.eventListener=function(eventType,fn){ //如果对象callback中不存在eventType属性,则初始化一个eventType属性; callback[eventType]=callback[eventType]?callback[eventType]:[]; //推入回调函数 callback[eventType].push(fn); } } }).call(this); } var gaofei=new Thief(‘高飞‘); gaofei.eventListener(‘steal‘,function(){ console.log(‘旺财叫了‘); }); gaofei.eventListener(‘escape‘,function(){ console.log(‘要跑就要跑快点!‘); }) gaofei.steal();// 高飞在偷东西-->旺财叫了 gaofei.escape();// 高飞逃跑了-->要跑就要跑快点!
//小偷的构造函数 function Thief(name){ var callback={}; return (function(){ this.name=name; //首次创建实例时,为Thief的原型添加共有的方法 if(!Thief.prototype.steal){ Thief.prototype.steal=function(){ console.log(this.name+‘在偷东西‘); //如果callback.steal存在,则执行里面的回调函数 if(callback.steal){ callback.steal.forEach(function(fn,index){ fn(); }) } } Thief.prototype.escape=function(){ console.log(this.name+‘逃跑了‘); //如果callback.escape存在,则执行里面的回调函数 if(callback.escape){ callback.escape.forEach(function(fn,index){ fn(); }) } } //添加事件监听的方法 Thief.prototype.eventListener=function(eventType,fn){ //如果对象callback中不存在eventType属性,则初始化一个eventType属性; callback[eventType]=callback[eventType]?callback[eventType]:[]; //推入回调函数 callback[eventType].push(fn); } } }).call(this); } //狗的构造函数 function Dog(name){ var callback={}; return (function(){ this.name=name; //首次创建实例时,为Dog的原型添加共有的方法 if(!Dog.prototype.wow){ Dog.prototype.wow=function(){ console.log(this.name+‘汪!汪!汪!‘); if(callback.wow){ callback.wow.forEach(function(fn,index){ fn(); }) } } Dog.prototype.eventListener=function(eventType,fn){ //如果对象callback中不存在eventType属性,则初始化一个eventType属性; callback[eventType]=callback[eventType]?callback[eventType]:[]; //推入回调函数 callback[eventType].push(fn); } } }).call(this); } //人的构造函数 function Person(name){ var callback={}; return (function(){ this.name=name; //首次创建实例时,为Person的原型添加共有的方法 if(!Person.prototype.sleep){ //人共有的方法 Person.prototype.sleep=function(){ console.log(this.name+‘睡着了‘); if(callback.sleep){ callback.sleep.forEach(function(fn,index){ fn(); }) } } Person.prototype.wake=function(){ console.log(this.name+‘惊醒了‘); if(callback.wake){ callback.wake.forEach(function(fn,index){ fn(); }) } } Person.prototype.eventListener=function(eventType,fn){ //如果对象callback中不存在eventType属性,则初始化一个eventType属性; callback[eventType]=callback[eventType]?callback[eventType]:[]; //推入回调函数 callback[eventType].push(fn); } } }).call(this); } var gaofei = new Thief(‘高飞‘); var goudan = new Person(‘狗蛋‘); var wangcai = new Dog(‘旺财‘); goudan.eventListener(‘sleep‘, gaofei.steal.bind(gaofei));//将gaofei.steal中的this强制绑定到gaofei上 gaofei.eventListener(‘steal‘, wangcai.wow.bind(wangcai));//同理 wangcai.eventListener(‘wow‘, goudan.wake.bind(goudan));//同理 wangcai.eventListener(‘wow‘, gaofei.escape.bind(gaofei));//同理 goudan.sleep(); //控制台结果: /** 狗蛋睡着了--> * 高飞在偷东西--> * 旺财汪!汪!汪!--> * 狗蛋惊醒了--> * 高飞逃跑了--> **/
javascript面向对象--观察者模式(为对象添加事件监听功能)
标签:全局 cal 这一 引用 eve wow 事件 闭包 pre
原文地址:http://www.cnblogs.com/zhunrong/p/6623641.html