three.js 源码分析之EventDispatcher

事件调度,是一个事件的容器,Object3D继承自该类,说明该类是three.js的实体基类,作用是隔离事件触发与事件处理的过程,降低实体之间的耦合度。

//定义事件调度类

function EventDispatcher() {}

//定义该类的原型

Object.assign( EventDispatcher.prototype, {

        //添加事件监听,可针对同一个事件添加多个监听

        addEventListener: function ( type, listener ) {

      
        // 如果监听集合为未定义就创建
        if ( this._listeners === undefined ) this._listeners = {};

        //获取监听对象
        const listeners = this._listeners;

        //如果type类型的监听不存在就创建,该类型的数组
        if ( listeners[ type ] === undefined ) {
            //定义监听数组
            listeners[ type ] = [];

        }
        //如果监听集合中不包含该类型的处理过程,则加入处理
        if ( listeners[ type ].indexOf( listener ) === - 1 ) {

            listeners[ type ].push( listener );

        }

    },

    //监测是否包含该类型的监听
    hasEventListener: function ( type, listener ) {
        //没有监听集合
        if ( this._listeners === undefined ) return false;
        //含有监听集合
        const listeners = this._listeners;
        //监听存在检查
        return listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;

    },

    //移除监听
    removeEventListener: function ( type, listener ) {

        if ( this._listeners === undefined ) return;

        const listeners = this._listeners;
        const listenerArray = listeners[ type ];

        if ( listenerArray !== undefined ) {

            const index = listenerArray.indexOf( listener );

            if ( index !== - 1 ) {
                //移除监听
                listenerArray.splice( index, 1 );

            }

        }

    },

    //调度事件
    dispatchEvent: function ( event ) {

        if ( this._listeners === undefined ) return;

        const listeners = this._listeners;
        const listenerArray = listeners[ event.type ];

        if ( listenerArray !== undefined ) {

            event.target = this;

            // Make a copy, in case listeners are removed while iterating.
            // 拷贝一份,防止监听在处理时被删除
            const array = listenerArray.slice( 0 );

            for ( let i = 0, l = array.length; i < l; i ++ ) {
                //调用处理过程,其中处理过程中的this是EventDispatcher类,可能是针对dom事件才这样处理的,自定义类应该不会起作用
                array[ i ].call( this, event );

            }

        }

    }

} );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值