Tengo algunas preguntas sobre mi patrón de herencia prototípico que estoy usando para mi aplicación. En primer lugar, eche un vistazo al patrón que estoy usando;

const myObjectProto = (function() {

  const proto = Object.create( parentProto );

  // private variables
  let title = 'Some String';

  // private functions
  const addEmoticon = function() {
    return title + ' ';
  }

  proto.getTitle = function() {
    return addEmoticon();
  }

  return proto;
})();

Y cuando quiera usarlo, lo usaré como a continuación:

const firstObject = Object.create( myObjectProto );
const secondObject = Object.create( myObjectProto );

// call a public function
firstObject.getTitle();
secondObject.getTitle();

Mi primera pregunta es la siguiente: suponga que estamos creando 100 objetos a partir de su proto correspondiente; Hasta donde yo sé, title se comparte entre ellos. Eso significa que si una función la cambia, se cambiará para todos los objetos creados. Estoy un poco preocupado por la memoria en este caso. ¿Utilizo la memoria de forma eficiente con este patrón? ¿Alguien puede aclarar cómo se comporta Object.create con title?

Mi segunda pregunta es sobre la pérdida de memoria; Digamos que queremos establecer el primer objeto en nulo;

firstObject = null;

Basado en el hecho de que hemos compartido variables como title e incluso proto, creo que no hace nada y tengo pérdida de memoria. Estoy en lo cierto? Si esto es cierto, ¿cómo puedo solucionarlo?

0
Reza 27 sep. 2019 a las 14:55

1 respuesta

La mejor respuesta

title es una variable local. Existirá siempre que algún código pueda acceder a él. Solo existirá una vez, ya que el IIFE solo se ejecuta una vez, por lo que solo se crea una variable. La función dentro de addEmoticon puede acceder a title, en otras palabras, se cierra sobre ella . Como es un local en sí mismo, solo existirá mientras se pueda acceder a él. Se accede dentro de la función almacenada dentro de proto.getTitle, que nuevamente cierra addEmoticon. proto.getTitle existe siempre que se pueda acceder a proto. A medida que el valor de proto se almacena dentro de la variable global const myObjectProto, siempre se puede acceder a ella, por lo que vivirá para siempre (así como todos los valores a los que se puede acceder a través de ella, por ejemplo, title ).

¿Utilizo la memoria de forma eficiente con este patrón?

Bueno, asigna unos pocos bytes una vez. Suponiendo que tiene unos pocos Megabytes disponibles, eso no es mucho.

Hasta donde yo sé, el título se comparte entre ellos.

Sí.

Basado en el hecho de que hemos compartido variables como título e incluso proto, creo que no hace nada y tengo pérdida de memoria.

Pierde la referencia a la instancia almacenada en firstObject, lo que la hace viable para la recolección de basura. Eso podría liberar algunos bytes. Como el prototipo todavía está disponible a través de secondObject y myObjectProto, seguirá funcionando.

Tengo pérdida de memoria. Estoy en lo cierto?

Una pérdida de memoria es una cantidad notable de memoria, que aún se asigna aunque los valores que contiene ya no necesitan ser usados. Suponiendo que desea trabajar con secondObject y crear nuevas instancias desde myObjectProto, todo lo que ha almacenado sigue siendo necesario . Tu código está perfectamente bien.

1
Jonas Wilms 27 sep. 2019 a las 12:26