2009-11-28 25 views
5

¿Hay alguna forma en JavaScript para heredar miembros privados de una clase base a una subclase?¿Cómo heredar un miembro privado en JavaScript?

que quiero lograr algo como esto:

function BaseClass() { 
    var privateProperty = "private"; 

    this.publicProperty = "public"; 
} 

SubClass.prototype = new BaseClass(); 
SubClass.prototype.constructor = SubClass; 

function SubClass() { 
    alert(this.publicProperty); // This works perfectly well 

    alert(this.privateProperty); // This doesn't work, because the property is not inherited 
} 

¿Cómo puedo lograr una simulación de clase similar, al igual que en otras oop-idiomas (por ejemplo C++.) Donde pueda heredar propiedades privadas (protegidas)?

Gracias, David Schreiber

+0

Este patrón no agrega una propiedad privada. Solo agrega una variable local llamada privateProperty en la función BaseClass. – erikkallen

+1

ver http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592 para obtener mi opinión sobre dicha bastardización del lenguaje; aprende la semántica de JS en lugar de tratar de emular C++ – Christoph

Respuesta

11

Usando Douglas Crockfords power constructor pattern (enlace es un video), se puede lograr las variables protegidas de esta manera:

function baseclass(secret) { 
    secret = secret || {}; 
    secret.privateProperty = "private"; 
    return { 
     publicProperty: "public" 
    }; 
} 

function subclass() { 
    var secret = {}, self = baseclass(secret); 
    alert(self.publicProperty); 
    alert(secret.privateProperty); 
    return self; 
} 

Nota: Con el patrón constructor de poder, no utiliza new. En cambio, simplemente diga var new_object = subclass();.

+0

¡Muchas gracias! El enlace al video del patrón de constructor de energía me ayudó mucho. Esto era exactamente lo que estaba buscando. Ahora entiendo que hay mucho más que aprender sobre JS y objetos :-) –

+1

El enlace ha cambiado; aquí está el nuevo: http://www.yuiblog.com/blog/2006/11/27/video-crockford-advjs/ (El enlace original era a la parte 1) –

+1

No debería ser 'secret.privateProperty' 'secret.protectedProperty' y luego private sería algo así como' var privateProperty'? – sabgenton

0

Esto no es posible. Y eso no es realmente una propiedad privada; es simplemente una variable regular que solo está disponible en el ámbito en el que se definió.

0

Eso no se puede hacer, pero se puede eliminar la propiedad del prototipo de la clase para que no se hereda:

SubClass.prototype.privateProperty = undefined; 

De esa manera no va a ser hereditaria, pero hay que hacerlo por cada propiedad "privada" en su clase base.

2

Marque sus privadas variables con algún tipo de marcado como un subrayado inicial _ De esta manera usted sabe que es una variable privada (aunque técnicamente no lo es)

this._privateProperty = "private"; 
alert(this._privateProperty) 
Cuestiones relacionadas