Definir miembros de campo privado y herencia en el patrón del módulo JAVASCRIPT

Puedo definir campos de miembros privados en un patrón de módulo usando el siguiente código

var myClass = function(){ var private_field1,private_field_2; var private_func1 = function(){ //....... } //......... var myObj = { global_field1:2, global_field2:"something", global_func: function(){//......} } return myObj; }; var obj = myClass(); 

Este método funciona bien, pero el problema con este problema es que cada vez que creo un nuevo objeto, la copia de todas las funciones se crea y carga en la memoria (no como Java, donde todos los objetos de la misma clase comparten la misma memoria funcional)

Intenté usar otro método a continuación:

  var myClass = (function(){ var private_field1,private_field_2;//private static fields var private_func1 = function(){ //....... } //......... var Constr = function(){ //do something } Constr.prototype = { //................ global_func: function(){//......} } return Constr; }()); var obj1 = new myClass(); var obj2 = new myClass(); 

Pero el problema con este método es que, obviamente, obj1, obj2 comparten la misma copia de los campos privados (por lo que efectivamente son estáticos). Entonces, ¿hay alguna manera de definir campos privados en el patrón del módulo al usar la misma copia de funciones para los objetos?

Y para la herencia del primer método mencionado anteriormente, primero necesito crear un objeto dentro de la clase hija y luego devolver ese objeto.

  var ChildClass = function(){ var childobj = myClass(); //override or add functions to childobj return childobj ; } 

Pero esto es solo envolviendo el objeto de baseClass en childClass, ¿hay alguna otra forma de implementar lo mismo (para el primer o segundo método) para que pueda actuar como herencia verdadera de Java con métodos protegidos, privados, etc.?

    No. La privacidad en JavaScript solo se puede lograr por scope (y exportar desde ellos: cierres).

    Aquellas funciones que necesitan acceder a las variables privadas (y funciones), llamadas métodos privilegiados, deben definirse dentro del constructor. Aquellos métodos que no lo hacen (que solo interactúan con propiedades públicas u otros métodos) deben definirse en el objeto prototipo, por lo que obtendrá un enfoque mixto al final. Potencialmente combinado con los valores estáticos que acabas de descubrir.

    Por cierto, no la función [code] en sí misma se copia y memoriza varias veces. Solo se deben almacenar objetos de ámbito diferente (entornos léxicos).

    Por lo general, la herencia no se realiza creando objetos principales y ampliándolos, sino creando instancias secundarias y extendiéndolas como un elemento primario. Esto se puede hacer aplicando el constructor del padre en el niño recién creado:

     function ChildClass() { ParentClass.call(this, /* … arguments */); // usual body, using "this" } 

    Además, el prototipo del Niño hereda directamente del objeto prototipo de la Matriz. Esto se puede hacer a través de Object.create (necesita ser modificado para los navegadores heredados):

     ChildClass.prototype = Object.create(ParentClass.prototype, { constructor: {value:ChildClass} });