2011-06-08 13 views
6

Tengo algunas JS que verás a continuación. Quiero que el objeto de la clase interna pueda acceder a su padre. Necesita acceder a los métodos y propiedades principales. La forma en que lo he hecho funciona, pero me gustaría saber si hay algo que pueda hacer en el constructor de clase interna para obtener el padre, en lugar de que el padre tenga que decirle explícitamente al hijo quién es su padre. Parece torpe.¿Mejor forma de que el objeto secundario acceda al objeto principal?

<html> 
<body> 
<script> 
function ChildClass(name){ 
    //this.myParent= no way of knowing ..... 
    this.myName=name; 
    this.whereDidIComeFrom=function(){ 
     document.write(this.myName+ " came from " +this.myParent.dad+"<br>"); 
    } 
} 

function ParentClass(name){ 
    this.dad=name; 
    this.myChild=new ChildClass(name+"son"); 
    this.myChild.myParent=this; //only way I know for myChild to access parent 
    this.myChild.whereDidIComeFrom(); 
} 

var parentDavid = new ParentClass("David"); 
var parentJohn = new ParentClass("John"); 
</script> 
</body> 
</html> 

El resultado de la ejecución que se ve así:

Davidson vino de David

Johnson vino de John

Lo pregunto porque la estructura anterior ya existe en el proyecto que estoy manteniendo. No puedo ir a rediseñar todo. Es solo ahora que el objeto hijo tiene que acceder a su padre. Anteriormente no era necesario. Sería bueno no tener que cambiar la clase para padres y hacer todos mis cambios dentro del niño. Pero si lo que tengo es básicamente "lo que tienes que hacer", entonces que así sea.

Respuesta

5

Esta es la forma correcta de hacerlo, en principio. Podría hacerlo un poco más lujoso, proporcionando una función de introducirParent() en el niño que comprueba, si la referencia principal ya está establecida, pero eso no cambia el núcleo del asunto.

Mientras que un niño en su modelo de datos puede pertenecer a un solo padre, Javascript no lo sabe. Podría haber varios padres haciendo referencia al mismo niño, por ejemplo (los rumores dicen que a veces sucede en la naturaleza). De hecho, el niño no es una "clase interna" del padre. El niño y el padre son meramente asociados, es decir, "de alguna manera se conocen entre sí", lo cual es una relación no especificada, pero ninguno es parte (o propiedad) del otro.

+0

Gracias T-Bull. Lo más probable es que agregue una función de introducción de esa manera. – Dee2000

0

La manera clásica de que esto ocurra es con eventos. Puede implementar un evento que obtenga información del controlador de eventos.

En un buen diseño, si desea el valor "foo" de los padres, los padres que implementan "foo" tienen un ancestro común que declara "foo", y el antecesor sería el único lugar para implementar su "foo" "-entrenador de animales.

Lo que tiene ahora presenta la temida reducción de la cohesión y la ampliación del acoplamiento.

1

Mi preferencia sería pasar el elemento primario al elemento secundario cuando se crea el elemento secundario, en lugar de configurarlo como un paso separado después de crear el elemento secundario. Así código casi exactamente como la suya, excepto con un parámetro adicional en la función ChildClass:

<script> 
function ChildClass(name,myParent){ 
    this.myParent=myParent; 
    this.myName=name; 
    this.whereDidIComeFrom=function(){ 
     if (this.myParent != undefined && this.myParent.dad != undefined) 
      document.write(this.myName+ " came from " +this.myParent.dad+"<br>"); 
     else 
      document.write(this.myName+ " has no father<br>"); 
    } 
} 

function ParentClass(name){ 
    this.dad=name; 
    this.myChild=new ChildClass(name+"son",this); 
    this.myChild.whereDidIComeFrom(); 
} 

var parentDavid = new ParentClass("David"); 
var parentJohn = new ParentClass("John"); 

Por supuesto, no hay nada que le para el cambio de la matriz después de crear el niño, o la creación de los niños con padres o undefined por no pasando ese parámetro.

+0

Gracias nnnnnn, eso es una mejora para mi ejemplo simple. Aunque pude haber simplificado demasiado mi ejemplo. En el proyecto del mundo real, el constructor de la clase Child tiene un conjunto de parámetros y se usa en muchos lugares diferentes. Entonces, idealmente, preferiría dejar los parámetros del constructor sin cambios. Elegir hacerlo (mágicamente) en el propio constructor o hacerlo externamente como en mi ejemplo original. – Dee2000

+0

@ Dee2000: no olvide que puede agregar un parámetro de función al final de la lista sin necesidad de cambiar todos los lugares que llaman a la función (no se definirá si no se transfiere). Pero entiendo y estoy de acuerdo en que sería más genial si hubiera alguna forma de que el constructor supiera qué lo llamó. Ya sea que agregue un parámetro o lo configure después, asegúrese de que su objeto hijo lo permita cuando no se haya configurado (como lo hice en mi código de ejemplo). – nnnnnn

+0

Re: el escenario indefinido. ¡Absolutamente! :) – Dee2000

Cuestiones relacionadas