¿Alguien tiene una buena solución para extender console.log para que imprima automáticamente el nombre y el método de la clase como prefijo? Estoy usando componentes web y el uso estricto está activado.
someFunction() { let varA = "hello" console.log(this.constructor.name, "someFunction", {varA}) }Me gustaría automatizar esta parte: this.constructor.name, "someFunction", ...
arguments.callee.name imprimirá el nombre de la función, pero ya no funciona con el modo estricto activado. Ampliación de console.log en una ubicación centralizada a través de:
export var log = function(){ var args = Array.prototype.slice.call(arguments); args.unshift(this.constructor.name + ": "); console.log.apply(console, args); } no funciona porque this.constructor.name no imprime el contexto correcto y si no está en un componente web, no funciona en absoluto.
Extender console.log en cada componente web anula el propósito (o la mitad). Podría doblar una función que extienda console.log en la compilación para cada componente web, pero aún tendría el problema de no poder llamar a arguments.callee. Usando lit-element, pero este es un problema nativo de javascript.
console.trace() puede ser útil aquí, en lugar de un método de consola personalizado. O use la nueva propiedad .stack de new Error() .
class A { b() { return function c() { return function d() { return (function e() { return new Error().stack; })(); } } } } console.log("here's the stack:\n", new A().b()()());Entonces, según la respuesta de sean-7777, supongo que podríamos dividir la salida de la pila de esta manera:
let funcname = new Error().stack.split('\n')[1]; funcname=funcname.slice(funcname.indexOf("at ")+3, funcname.indexOf(" (")); console.log(debugline, 'debug text');Si lo coloca en una función de ayuda, podría tomar el índice de línea 2 (ya que el índice 1 le daría el nombre de la función de ayuda).
Esperaba algo un poco más sencillo, pero piratear la salida funciona.
ACTUALIZAR:
export function prtfun() { let debugline = new Error().stack.split('\n')[2]; return debugline.slice(debugline.indexOf("at ")+3, debugline.indexOf(" (")); }llámelo desde cualquier lugar como este: console.log(prtfun(), 'log text...');
e imprimirá el texto de registro ClassName.FunctionName...
Funciona genial. Sin embargo, deshabilitaría esto en producción.