'use strict'; var toString = Object.prototype.toString; /** * Extract names from functions. * * @param {Function} fn The function who's name we need to extract. * @returns {String} The name of the function. * @public */ module.exports = function name(fn) { if ('string' === typeof fn.displayName && fn.constructor.name) { return fn.displayName; } else if ('string' === typeof fn.name && fn.name) { return fn.name; } // // Check to see if the constructor has a name. // if ( 'object' === typeof fn && fn.constructor && 'string' === typeof fn.constructor.name ) return fn.constructor.name; // // toString the given function and attempt to parse it out of it, or determine // the class. // var named = fn.toString() , type = toString.call(fn).slice(8, -1); if ('Function' === type) { named = named.substring(named.indexOf('(') + 1, named.indexOf(')')); } else { named = type; } return named || 'anonymous'; };