Búsqueda de sitios web

aplicación parcial - Privacidad en JavaScript


La delimitación de funciones ofrece la única privacidad en JavaScript.

Entonces, lo canónico:

function Ctor(dep1, dep2) {
  this._dep1 = dep1;
  this._dep2 = dep2;
}

Ctor.prototype.foo = function() {
  // use this._dep1/2...
}

...es problemático en cuanto que no ofrece encapsulación para las dependencias inyectadas.

Una alternativa (aunque ligeramente diferente en términos de ubicación de foo) que ofrece una verdadera encapsulación podría ser:

function factory(dep1, dep2) {
  return {
    foo: partial(foo, dep1, dep2), // or use bind (partial could be a library fn for partial application)
  };
}

function foo(dep1, dep2) {
  // use dep1/2
}

Pero rara vez veo este patrón. ¿Hay una buena razón para no usar el último?

Respuesta #1

Ya mencionas las ventajas del segundo patrón. Las desventajas son:

  • debes agrupar los métodos por visibilidad (incluso si el método privado está íntimamente relacionado con uno público, pero apenas relacionado con otros métodos privados), o repetir todos los métodos públicos en el literal de objeto (lo cual no funciona bien con jsdoc).

  • el código introduce un objeto de función separado para cada instancia de tu clase, lo que sacrifica algo de rendimiento (esto normalmente no importa, pero a veces podría)

  • a diferencia de los modificadores privados en muchos lenguajes de programación, esta encapsulación no puede ser eludida, incluso si se aplica incorrectamente y realmente sé lo que estoy haciendo (históricamente, JavaScript ha sido un entorno donde todo vale, y muchos atribuyen su éxito a esta extensibilidad)

Respuesta #2

Simple: ¿por qué?

La "privacidad" está terriblemente sobrevalorada. No oculta nada a nadie que realmente lo quiera. Tener miembros "protegidos" o "privados" es puramente para beneficio del programador, específicamente para indicar cómo se supone que se debe usar un miembro en particular (esto aquí es una API pública, esto aquí no lo es, así que por favor no lo toques a menos que sepas lo que hace). Eso es todo. Una convención de nombres, como comenzar con guiones bajos, es perfectamente suficiente para implementar eso. Si un nombre de miembro comienza con un guion bajo, no lo toques, a menos que sepas lo que estás haciendo.

No hay una necesidad intrínseca de esforzarse más allá de eso.