Creo que he entendido mal cómo funciona la herencia prototípica de Javascript. Específicamente, las variables internas de los prototipos parecen estar compartidas entre múltiples subobjetos diferentes. Es más fácil de ilustrar con código:Variables privadas en prototipos heredados
var A = function()
{
var internal = 0;
this.increment = function()
{
return ++internal;
};
};
var B = function() {};
// inherit from A
B.prototype = new A;
x = new B;
y = new B;
$('#hello').text(x.increment() + " - " + y.increment());
Esto da salida a 1 - 2
(prueba en JSBin), mientras que estaba totalmente convencida que el resultado sea 1 - 1
, ya que quería dos objetos separados.
¿Cómo puedo asegurarme de que el objeto A
no sea objeto compartido entre varias instancias de B
?
actualización: This article destaca algunos de los problemas:
El problema es que el alcance de cada enfoque utiliza para crear una variable privada, que funciona bien, es también el cierre, en la acción, que los resultados en si cambia una variable privada para una instancia de objeto, se cambia para todos. Es decir. se parece más a una propiedad estática privada que a una variable privada real.
Por lo tanto, si desea tener algo privado, más como una constante no pública, cualquiera de los enfoques anteriores es bueno, pero no para las variables privadas reales. Las variables privadas solo funcionan muy bien con objetos singleton en JavaScript.
Solución: De acuerdo con la respuesta de BGerrissen, el cambio de la declaración de B
y dejando del prototipo funciona como se pretende:
var B = function() { A.apply(this, arguments); };
Pero el punto aquí es que la funcionalidad pertenece en 'A', y se comparte entre varios "clases" sub-('B', 'C' y 'D'). ¿No hay posibilidad de variables privadas no estáticas en superclases en Javascript? –
Una forma común de significar intenciones 'privadas' (es decir, advirtiendo a los programadores que algo especial está sucediendo con una propiedad) es usar el guión bajo como prefijo del nombre de la propiedad (es decir, obj._privateMember). Aunque esto funcionará con la herencia de cadenas y números, comienza a volverse más complejo cuando se usan objetos y matrices como propiedades. – BGerrissen
No tengo claro exactamente lo que estás preguntando. ¿Desea que una variable definida dentro de la función 'A' esté disponible para los métodos de 'B',' C' y 'D' pero en ninguna otra parte? Trate de no pensar en cosas en JavaScript en términos de características de otros lenguajes (como Java o C#). JavaScript simplemente no tiene clases. Tiene objetos que heredan propiedades de otros objetos a través de una cadena de prototipos. –