Invertir palabras en la cadena de matrices coincidencia puntuacion en Javascript

¿Cómo invierto las palabras en esta cadena incluyendo la puntuación?

String.prototype.reverse = function () { return this.split('').reverse().join(''); } var str = "This is fun, hopefully."; str.reverse(); 

Actualmente estoy recibiendo esto:

 ".yllufepoh ,nuf si sihT" 

Cuando quiero devolver esto:

 "sihT si nuf, yllufepoh." 

Simplemente invertir la cadena no dará la solución.

  1. Recibe cada palabra.
  2. Revertirla
  3. De nuevo reincorporarse
 var str = "This is fun, hopefully."; alert(str.split("").reverse().join("").split(" ").reverse().join(" ")); 

Puede invertir cada palabra en lugar de toda la cadena, pero debe mantener espacios, puntos, etc. separados, por lo que se necesita un límite de palabra

 String.prototype.reverse = function () { return this.split(/\b/g).map(function(word) { return word.split('').reverse().join(''); }).join(''); } var str = "This is fun, hopefully."; document.body.innerHTML = str.reverse();