Lo que está haciendo en su ejemplo no es el patrón de "clase" que la gente piensa en JS: normalmente las personas piensan en el modelo de clase más "normal" de Java/C#/C++/etc que puede fingido con las bibliotecas.
En vez tu ejemplo es en realidad bastante normal y buen diseño JS, pero para la integridad voy a discutir las diferencias de comportamiento se podrán ver entre los "miembros" privadas y públicas que tiene
var private = "a private variable";
this.public = "a public variable";
Acceso private
desde dentro cualquiera de sus funciones será mucho más rápida que acceder al public
porque la ubicación de private
se puede determinar razonablemente bien solo con una búsqueda estática del motor JS. Los intentos de acceder al public
requieren una búsqueda, la mayoría de los motores JS modernos realizan cierto grado de almacenamiento en la memoria caché de búsqueda, pero aún así es más costoso que un simple acceso var variado.
var privatefn = function() { ... };
this.publicfn = function() { ... };
Las mismas reglas de búsqueda se aplican a estas funciones al igual que con accede la variable anterior, la única diferencia real (en su ejemplo) es que si sus funciones se llaman, dicen privatefn()
vs this.publicfn()
, privatefn
siempre obtendrá lo global objeto para this
. Pero también si alguien hace
f = foo.publicfn;
f();
A continuación, la llamada a f
tendrá el objeto global como this
pero será capaz de modificar la variable private
.
La forma más normal de hacer funciones públicas sin embargo (que resuelve la función pública separada que modifica el problema de miembros privados) es poner funciones públicas en el prototipo, por ejemplo.
Foo.prototype.publicfn = function() { ... }
lo que obliga a las funciones públicas de no modificar la información privada - hay algunas veces que esto no es una opción, pero es una buena práctica ya que también reduce el uso de memoria un poco, tomar:
function Foo1() {
this.f = function(){ return "foo" };
}
vs
function Foo2() {
}
Foo2.prototype.f = function(){ return "foo" };
En Foo1
tiene una copia del objeto de la función para cada instancia de Foo1
(no todo el Emory, sólo el objeto, p.ej. new Foo1().f !== new Foo2().f
) mientras que en Foo2
solo hay un objeto de función único.
Su ejemplo FooClass es incorrecto. La semántica de new es efectiva: "var foo = {}; foo .__ proto__ = FooClass.prototype; var temp = FooClass.call (temp); if (IsObject (temp)) foo = temp;". Esto significa que en su ejemplo foo será el nuevo objeto "{reallypublicfn: function() {...}}" para que no tenga el prototipo FooClass o la función publicfn – olliej