¿Cuál es la diferencia entre variable privada, variable pública y variable estática? ¿Cómo logramos esto en JS?

Las variables privadas y públicas son dos formas de ocultar información. Un objeto puede tener variables privadas y públicas (y también variables protegidas, en algunos idiomas). Todos los miembros (funciones y variables) del objeto propietario pueden acceder a las variables privadas, pero ningún otro objeto puede acceder a ellas. Entonces, esta información está oculta. Todos los miembros del propietario pueden acceder a las variables públicas, así como otros objetos que pueden acceder al propietario.
Las variables estáticas están relacionadas con una clase. Entran en existencia tan pronto como una clase entra en existencia. No importa si la clase tiene objetos o no, las variables estáticas estarían allí. En lo que respecta a las variables no estáticas, son propiedad de objetos (instancias de una clase). Cada objeto tiene su propia copia de variables no estáticas.

Ahora, JavaScript de forma nativa no admite estos conceptos. Pero puede usar las técnicas de cierre de JavaScript para lograr resultados similares.

Variable pública y privada
El truco básico para definir una variable privada es limitar el alcance de las variables dentro de la definición de clase para que no se pueda acceder a ellas a través de los objetos instanciados. P.ej:

  función Class () {
     var privateVar = "¡Soy privado!"; 
     this.publicVar = "¡Soy público!"; 
     this.publicMethod = function () {
         volver privateVar;
     }
 }

Un nuevo objeto se puede definir como,
var obj = new Class();

Ahora, puede acceder al método público como:
obj.publicVar; //Returns "I am public!"

Pero no hay forma posible de acceder al privateVar . Y como el concepto de ocultar información define, se puede acceder dentro del objeto. Por lo tanto, se puede acceder a publicMethod en publicMethod .
obj.publicMethod(); //Returns "I am private!"

Estas son todas las variables no estáticas, ya que cada objeto que cree de tipo Class tendrá su propia copia de privateVar y privateVar .

Variables estáticas
Las variables estáticas son propiedad de la clase. Por lo tanto, debe acceder a ellos a través de la clase, no a través del objeto. El truco aquí es asignarlos a la propia definición de clase.
Class.staticVar = "I am static!";

Ahora puedes acceder a él usando:
Class.staticVar; //Returns "I am static!"

Tenga en cuenta que no puede acceder usando:
obj.staticVar; //Returns undefined

JavaScript es un lenguaje muy agradable y poderoso, si puedes entenderlo.

Estos tocan temas profundos. En C ++ hay miembros privados, protegidos y públicos. Miembros públicos pueden ser accedidos por otras clases. Las variables protegidas y privadas solo pueden acceder otros miembros de la clase. Cuando alguien hereda de una clase, puede acceder a los miembros protegidos, pero no a los privados. También puedes declarar amigos; otras clases, funciones, operadores, etc. que pueden acceder a miembros privados y protegidos. Referencia:
http://www.parashift.com/c++-faq

Java (no JavaScript, llegaré a eso) usa construcciones similares:
http://docs.oracle.com/javase/tu

JavaScript no es compatible con miembros protegidos o privados de forma nativa, pero puede imitarlo utilizando el alcance:
http://net.tutsplus.com/tutorial
http://phrogz.net/JS/classes/OOP

Una variable estática no miembro en C / C ++ no se reinicializa cuando vuelve a su alcance después de la primera vez. Una variable miembro estática en C ++ tiene solo una instancia, sin importar cuántas instancias de la clase haya. En JavaScript tienes un par de opciones. Puede crear una variable global que nunca se salga del alcance o aprovechar algunas técnicas específicas de JavaScript:
http://stackoverflow.com/questio