1919// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2020// USE OR OTHER DEALINGS IN THE SOFTWARE.
2121
22+ var objectCreate = Object . create || objectCreatePolyfill
23+ var objectKeys = Object . keys || objectKeysPolyfill
24+ var bind = Function . prototype . bind || functionBindPolyfill
25+
2226function EventEmitter ( ) {
23- EventEmitter . init . call ( this ) ;
27+ if ( ! this . _events || ! Object . prototype . hasOwnProperty . call ( this , '_events' ) ) {
28+ this . _events = objectCreate ( null ) ;
29+ this . _eventsCount = 0 ;
30+ }
31+
32+ this . _maxListeners = this . _maxListeners || undefined ;
2433}
2534module . exports = EventEmitter ;
2635
@@ -34,28 +43,29 @@ EventEmitter.prototype._maxListeners = undefined;
3443// added to it. This is a useful default which helps finding memory leaks.
3544var defaultMaxListeners = 10 ;
3645
37- Object . defineProperty ( EventEmitter , 'defaultMaxListeners' , {
38- enumerable : true ,
39- get : function ( ) {
40- return defaultMaxListeners ;
41- } ,
42- set : function ( arg ) {
43- // check whether the input is a positive number (whose value is zero or
44- // greater and not a NaN).
45- if ( typeof arg !== 'number' || arg < 0 || arg !== arg )
46- throw new TypeError ( '"defaultMaxListeners" must be a positive number' ) ;
47- defaultMaxListeners = arg ;
48- }
49- } ) ;
50-
51- EventEmitter . init = function ( ) {
52- if ( ! this . _events || this . _events === Object . getPrototypeOf ( this ) . _events ) {
53- this . _events = Object . create ( null ) ;
54- this . _eventsCount = 0 ;
55- }
56-
57- this . _maxListeners = this . _maxListeners || undefined ;
58- } ;
46+ var hasDefineProperty ;
47+ try {
48+ var o = { } ;
49+ if ( Object . defineProperty ) Object . defineProperty ( o , 'x' , { value : 0 } ) ;
50+ hasDefineProperty = o . x === 0 ;
51+ } catch ( err ) { hasDefineProperty = false }
52+ if ( hasDefineProperty ) {
53+ Object . defineProperty ( EventEmitter , 'defaultMaxListeners' , {
54+ enumerable : true ,
55+ get : function ( ) {
56+ return defaultMaxListeners ;
57+ } ,
58+ set : function ( arg ) {
59+ // check whether the input is a positive number (whose value is zero or
60+ // greater and not a NaN).
61+ if ( typeof arg !== 'number' || arg < 0 || arg !== arg )
62+ throw new TypeError ( '"defaultMaxListeners" must be a positive number' ) ;
63+ defaultMaxListeners = arg ;
64+ }
65+ } ) ;
66+ } else {
67+ EventEmitter . defaultMaxListeners = defaultMaxListeners ;
68+ }
5969
6070// Obviously not all Emitters should be limited to 10. This function allows
6171// that to be increased. Set to zero for unlimited.
@@ -200,7 +210,7 @@ function _addListener(target, type, listener, prepend) {
200210
201211 events = target . _events ;
202212 if ( ! events ) {
203- events = target . _events = Object . create ( null ) ;
213+ events = target . _events = objectCreate ( null ) ;
204214 target . _eventsCount = 0 ;
205215 } else {
206216 // To avoid recursion in the case that type === "newListener"! Before
@@ -247,7 +257,9 @@ function _addListener(target, type, listener, prepend) {
247257 w . emitter = target ;
248258 w . type = type ;
249259 w . count = existing . length ;
250- console . warn ( '%s: %s' , w . name , w . message ) ;
260+ if ( typeof console === 'object' && console . warn ) {
261+ console . warn ( '%s: %s' , w . name , w . message ) ;
262+ }
251263 }
252264 }
253265 }
@@ -291,7 +303,7 @@ function onceWrapper() {
291303
292304function _onceWrap ( target , type , listener ) {
293305 var state = { fired : false , wrapFn : undefined , target : target , type : type , listener : listener } ;
294- var wrapped = onceWrapper . bind ( state ) ;
306+ var wrapped = bind . call ( onceWrapper , state ) ;
295307 wrapped . listener = listener ;
296308 state . wrapFn = wrapped ;
297309 return wrapped ;
@@ -330,7 +342,7 @@ EventEmitter.prototype.removeListener =
330342
331343 if ( list === listener || list . listener === listener ) {
332344 if ( -- this . _eventsCount === 0 )
333- this . _events = Object . create ( null ) ;
345+ this . _events = objectCreate ( null ) ;
334346 else {
335347 delete events [ type ] ;
336348 if ( events . removeListener )
@@ -376,11 +388,11 @@ EventEmitter.prototype.removeAllListeners =
376388 // not listening for removeListener, no need to emit
377389 if ( ! events . removeListener ) {
378390 if ( arguments . length === 0 ) {
379- this . _events = Object . create ( null ) ;
391+ this . _events = objectCreate ( null ) ;
380392 this . _eventsCount = 0 ;
381393 } else if ( events [ type ] ) {
382394 if ( -- this . _eventsCount === 0 )
383- this . _events = Object . create ( null ) ;
395+ this . _events = objectCreate ( null ) ;
384396 else
385397 delete events [ type ] ;
386398 }
@@ -389,15 +401,15 @@ EventEmitter.prototype.removeAllListeners =
389401
390402 // emit removeListener for all listeners on all events
391403 if ( arguments . length === 0 ) {
392- var keys = Object . keys ( events ) ;
404+ var keys = objectKeys ( events ) ;
393405 var key ;
394406 for ( i = 0 ; i < keys . length ; ++ i ) {
395407 key = keys [ i ] ;
396408 if ( key === 'removeListener' ) continue ;
397409 this . removeAllListeners ( key ) ;
398410 }
399411 this . removeAllListeners ( 'removeListener' ) ;
400- this . _events = Object . create ( null ) ;
412+ this . _events = objectCreate ( null ) ;
401413 this . _eventsCount = 0 ;
402414 return this ;
403415 }
@@ -486,3 +498,22 @@ function unwrapListeners(arr) {
486498 }
487499 return ret ;
488500}
501+
502+ function objectCreatePolyfill ( proto ) {
503+ var F = function ( ) { } ;
504+ F . prototype = proto ;
505+ return new F ;
506+ }
507+ function objectKeysPolyfill ( obj ) {
508+ var keys = [ ] ;
509+ for ( var k in obj ) if ( Object . prototype . hasOwnProperty . call ( obj , k ) ) {
510+ keys . push ( k ) ;
511+ }
512+ return k ;
513+ }
514+ function functionBindPolyfill ( context ) {
515+ var fn = this ;
516+ return function ( ) {
517+ return fn . apply ( context , arguments ) ;
518+ } ;
519+ }
0 commit comments