2011-10-29 7 views
50

console.log toma un número no especificado de argumentos y vuelca su contenido en una sola línea.Pase los argumentos a console.log como argumentos de primera clase a través de la función de proxy

¿Existe alguna forma de que pueda escribir una función que pase los argumentos pasados ​​directamente al console.log para mantener ese comportamiento? Por ejemplo:

function log(){ 
    if(console){ 
     /* code here */ 
    } 
} 

Este no sería el mismo que:

function log(){ 
    if(console){ 
     console.log(arguments); 
    } 
} 

Desde arguments es una matriz y console.log se volcar el contenido de la matriz. Tampoco será lo mismo que:

function log(){ 
    if(console){ 
     for(i=0;i<arguments.length;console.log(arguments[i]),i++); 
    } 
} 

Dado que eso imprimirá todo en líneas diferentes. El punto es mantener el comportamiento de console.log, pero a través de una función proxy log.

+ ---

que estaba buscando una solución que pudiera aplicarse a todas las funciones en el futuro (crear un proxy para una función de mantenimiento de la manipulación de argumentos intactas). Sin embargo, si eso no se puede hacer, aceptaré una respuesta específica de console.log.

Respuesta

77

Esto debe hacerlo ..

function log() { 
    if(typeof(console) !== 'undefined') { 
     console.log.apply(console, arguments); 
    } 
} 

Simplemente añadiendo otra opción (usando el operador spread y los parámetros rest - aunque arguments podrían utilizarse directamente con la propagación)

function log(...args) { 
    if(typeof(console) !== 'undefined') { 
     console.log(...args); 
    } 
} 
+3

Esto no funciona en Chrome/Safari. Lanza un error de "Invocación ilegal". – aditya

+3

@aditya, código actualizado ... no estaba usando el contexto correcto ... necesita pasar 'console' como el argumento' this' para aplicar .. –

+0

Awesome. Eso funciono. ¡Gracias! – aditya

3

Sí.

console.log.apply(null,arguments); 

Aunque, puede que tenga que recorrer los argumentos objeto y crear una matriz regular de ella, pero aparte de eso así es como usted lo hace.

+1

Esto no funciona en Chrome/Safari. Funciona en Firebug, pero está buscando una solución de navegador cruzado aquí. – aditya

+0

'args = []; para (i = 0; i

+0

No. Aparentemente, cualquier llamada a 'console.log.apply' arroja un error de invocación ilegal. – aditya

8

Hay un buen ejemplo del código html5boilerplate que se envuelve console.log de forma similar para asegurarse de no interrumpir ningún navegador que no lo reconozca. También agrega un historial y suaviza las diferencias en la implementación de console.log.

Fue desarrollado por Paul Irish y ha escrito una publicación en él here.

me ha pegado el código correspondiente a continuación, aquí hay un enlace al archivo en el proyecto: https://github.com/h5bp/html5-boilerplate/blob/master/js/plugins.js

// usage: log('inside coolFunc', this, arguments); 
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/ 
window.log = function(){ 
    log.history = log.history || []; // store logs to an array for reference 
    log.history.push(arguments); 
    if(this.console) { 
    arguments.callee = arguments.callee.caller; 
    var newarr = [].slice.call(arguments); 
    (typeof console.log === 'object' ? log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr)); 
    } 
}; 

// make it safe to use console.log always 
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}}((function(){try {console.log();return window.console;}catch(err){return window.console={};}})()); 
Cuestiones relacionadas