javascript自定义事件的观察者模式写法和用法以及继承

html 复制代码
<html>
    <head>
        <meta http-equiv="Context-Type:text/html;charset=utf-8"/>
        <title>自定义事件之观察者模式</title>
        <script type="text/javascript" src="common.js"></script>
    </head>
    <body>
        <input type="button" name="btn" value="点击" id="mybtn"/>
        <script type="text/javascript">
        //继承关系函数
            function inherit(sub,sup)
            {
                var prototype=Object(sup.prototype);
                prototype.constructor=sub;
                sub.prototype=prototype;
            }
			//父类函数
            function EventTarget(){
                this.handlers={};
            }
            //父类函数的原型方法
            EventTarget.prototype={
            	//使用字面量对象的原型方法必须加上构造函数原自父类,不然字面量原型方法就继承于object对象
                constructor:EventTarget,
                //注册自定义事件,也就是自定义事件的处理的函数
                addHandler:function(type,handler){
                    if(typeof this.handlers[type] =="undefined")
                    {
                        
                        this.handlers[type]=[];
                    }
                    this.handlers[type].push(handler);
                },
                //执行自定义事件的函数,也就是触发自定义事件的函数
                fire:function(event)
                {
                    if(!event.target)
                    {
                        event.target=this;
                       console.log(event);
                    }
                    if(this.handlers[event.type] instanceof Array)
                    {
                        var handlers=this.handlers[event.type];
                        //console.info(handlers);
                        for(var i=0;i<handlers.length;i++)
                        {
                            handlers[i](event);
                        }
                    }
                },
                //删除自定义事件函数
                removeHandler:function(type,handler)
                {
                    if(this.handlers[type] instanceof Array)
                    {
                        var handlers=this.handlers[type];
                        for(var i=0;i<handlers.length;i++)
                        {
                            if(handlers[i]===handler)
                            {
                                break;
                            }
                        }
                        handlers.splice(i,1);
                    }
                }
            };

            //子类
            function Person(name,age)
            {
                EventTarget.call(this);
                this.name=name;
                this.age=age;
            }
            //子类继承父类
            inherit(Person,EventTarget);
            //执行自定义事件函数
            Person.prototype.say=function(message)
            {
            	//type表示你自定义事件的种类,message表示触发后的信息
                this.fire({type:"message",message:message});
            }
			//执行自定义的事件的函数
            Person.prototype.data=function(event,str){
            //这里type同样表示自定义事件的种类,event表示传递过来的事件,data:str表示传递的数据
                this.fire({
                	//event这里表示从re()函数的btn事件中传递过来的点击事件
                    type:'data',x:event.clientX,y:event.clientY,data:str
                });
            };
            //getna事件,获取person的name\age
			 Person.prototype.getna=function(arr)
            {
                
                this.fire({type:'getna',getna:arr});
            }
            //一般事件信息处理函数
            function hm(event)
            {
                alert("message received: "+event.message);
            }
			//这里re(event)中的event表示从data事件中传递过来的event
			//处理点击事件带数据的函数
            function re(event)
            {
                var ss=event;
                btn.onclick=function(event){
                var event=EventUtil.getEvent(event);
                var target=EventUtil.getTarget(event);
                
                alert(event.x+":"+event.y);
                console.info(ss.data);
              }
            }
			//处理getna事件的函数
			function getnameage(event)
            {
                alert(event.getna);
            }
			//创建实例
            var person=new Person('Nicholas',23);
            //注册一般事件信息
            person.addHandler("message",hm);
            //注册点击事件,获取点击的坐标
            person.addHandler('data',re);
            //触发一般事件的信息
            person.say("Hi i am here");
           
            var btn=document.getElementById('mybtn');
            //触发带数据的点击事件
            person.data('','dfd');
            //先注册getna事件
            person.addHandler('getna',getnameage);
            //然后触发getna事件的函数
            person.getna([person.name,person.age]);
            
        </script>
    </body>
</html>
相关推荐
AI_零食4 分钟前
番茄钟鸿蒙PC Electron框架完成:状态机、定时器管理与专注力工具设计
前端·javascript·华为·electron·开源·鸿蒙·鸿蒙系统
提子拌饭1334 分钟前
逛三园游戏——基于鸿蒙PC Electron框架实现
前端·javascript·游戏·华为·electron·鸿蒙
爱因斯坦乐1 小时前
Vue项目整合
前端·javascript·vue.js
FlyWIHTSKY1 小时前
TS、TSX、JS、JSX 文件扩展名详解
开发语言·javascript·ecmascript
ct9782 小时前
组件间的通信
前端·javascript·vue.js
左手吻左脸。2 小时前
Vue 全栈面试题大全(2026 最新版最详细)
前端·javascript·vue.js
两个西柚呀2 小时前
js中的同步和异步,三种处理异步任务的方式
前端·javascript
小新1103 小时前
最简单但完整的 Vue 响应式示例(一个简单的计数器按钮)
前端·javascript·vue.js
川冰ICE3 小时前
JavaScript进阶④|Symbol与元编程,对象的隐藏身份
开发语言·javascript·ecmascript
水煮白菜王4 小时前
开源 AI 桌宠 Clawd on Desk:让 Claude Code 的状态从终端‘蹦‘到桌面
javascript·人工智能·开源