¿Cómo hacer una clase en JavaScript?

Hay muchas formas de hacer lo mismo en JavaScript. Sin embargo, he aprendido algunas formas, y algunas formas, francamente, no entiendo. ¿Podría alguien ayudarme a aclarar algunas cosas? (La primera vez que aprendí OOP en PHP.)

Así se puede hacer una clase como esta:

var object = new class(constructparams) {
    var private_members; // Can be accessed from within the code inside this definition only.
    this.public_members; // Can be accessed from everywhere.

    var private_functions = function() {}
    this.public_functions = function() {}
}

object.prototype.semi_public_members = function() {
    // Will be public, but can only access public members and methods.
    // E. g. private_members; is not available here.
}

¿Está todo esto correcto hasta ahora?

Entonces a alguien le gusta el enfoque de función anónima autoejecutable para crear un espacio de nombres. ¿Cuál es el punto de eso, cuando tienes este camino arriba que hace lo mismo, proporciona un espacio de nombres?

Y por último tienes la notación literal del objeto que no entiendo.

var object = { // Something strange in here }

¿Qué está pasando allí? Es json? Cómo se usa, cómo puedo usarlo. ¿Cuáles son los beneficios de usar esta forma en lugar de usar el método que describí? ¿Por qué prototipo en lugar de hacer la clase correctamente la primera vez?

Respuestas a la pregunta(4)

Su respuesta a la pregunta