@@ -14,6 +14,7 @@ const {
1414 Symbol,
1515 SymbolFor,
1616 SymbolToStringTag,
17+ SafeWeakMap,
1718 SafeWeakSet,
1819} = primordials ;
1920
@@ -577,21 +578,27 @@ function emitUnhandledRejectionOrErr(that, err, event) {
577578 process . emit ( 'error' , err , event ) ;
578579}
579580
581+ // A map of emitter -> map of name -> handler
582+ const eventHandlerValueMap = new SafeWeakMap ( ) ;
583+
580584function defineEventHandler ( emitter , name ) {
581585 // 8.1.5.1 Event handlers - basically `on[eventName]` attributes
582- let eventHandlerValue ;
583586 ObjectDefineProperty ( emitter , `on${ name } ` , {
584587 get ( ) {
585- return eventHandlerValue ;
588+ return eventHandlerValueMap . get ( this ) ?. get ( name ) ;
586589 } ,
587590 set ( value ) {
588- if ( eventHandlerValue ) {
589- emitter . removeEventListener ( name , eventHandlerValue ) ;
591+ const oldValue = eventHandlerValueMap . get ( this ) ?. get ( name ) ;
592+ if ( oldValue ) {
593+ this . removeEventListener ( name , oldValue ) ;
590594 }
591595 if ( typeof value === 'function' ) {
592- emitter . addEventListener ( name , value ) ;
596+ this . addEventListener ( name , value ) ;
597+ }
598+ if ( ! eventHandlerValueMap . has ( this ) ) {
599+ eventHandlerValueMap . set ( this , new Map ( ) ) ;
593600 }
594- eventHandlerValue = value ;
601+ eventHandlerValueMap . get ( this ) . set ( name , value ) ;
595602 } ,
596603 configurable : true ,
597604 enumerable : true
0 commit comments