Buenos días, felicitarte porque el calendario te ha quedado muy bien y además has añadido algún detalle como marcar el día actual de un color diferente.
Como has indicado hubiera sido deseable que el código estuviera comentado explicando el cometido de las distintas funciones.
Voy a hacer un pequeño recorrido por el código.
Al cargarse la página tiene el evento onload y se llama a la función calendario(). En esta función se define una propiedad para todos los objetos Date a la que se denomina monthDays y que nos devuelve el número de días del mes asociado al objeto Date invocado.
Se crea un objeto Date sin parámetros (tiempo del sistema) y se llama a la función fechaActual que se encarga de mostrar por pantalla el texto de la fecha actual en formato tipo "Febrero de 2076"
Se crea un array con las abreviaturas de los días Lu, Ma, Mi...
Se establece el día de comienzo para el mes invocando la función emprezarDia(fecha) que nos devuelve un valor entre 0 y 6 representando qué día de la semana es el primer día del mes. Por ejemplo 0 sería domingo, 1 lunes, 2 martes, etc.
Por último se invoca la función escribirCalendario pasándole la fecha actual, el array con los nombres de los días Lu, Ma, Mi..., el día de comienzo de 0 a 6 y el número de días que tiene el mes: escribirCalendario(fecha,nombreDias,diacomienzo,dias);
La función escribirCalendario va recorriendo las celdas de la tabla (elementos td) rellenando la primera fila con los días de la semana Lu, Ma, Mi...
Luego si el día de comienzo del mes es el 4 por ejemplo va rellenando con espacios en blanco hasta llegar al día de comienzo. Una vez en el día de comienzo empieza a escribir en cada celda los días del mes hasta alcanzar el final. Si el día coincide con el día actual, lo pinta de rojo.
El código lo veo sencillo y efectivo, hace perfectamente lo que pedía el ejercicio. Hay algún detalle como usar:
Date.prototype.monthDays= function(){
var d= new Date(this.getFullYear(), this.getMonth()+1, 0);
return d.getDate();
}
Esto no parece que realmente fuera necesario, pero es un buen ejemplo de uso de prototype para conseguir por herencia características comunes a objetos.
Quien quiera ver otra solución puede hacerlo en este otro hilo
https://www.aprenderaprogramar.com/foros/index.php?topic=3522.0Saludos