2008-10-09 44 views
5

¿Cómo puedo definir una clase anidada en Java Script?clase anidada de Javascript

Aquí es el fragmento de código que tengo:

objA = new TestA(); 

function TestB() 
{ 
    this.testPrint = function() 
    { 
    print (" Inside testPrint "); 
    } 
} 

function TestA() 
{ 
    var myObjB = new TestB(); 
} 

Ahora estoy tratando de acceder a la TestPrint usando objA

objA.myObjB.testPrint(); 

Pero su error dando "objA no tiene propiedades"

Cómo ¿Puedo acceder al método TestB utilizando el controlador objA?

Respuesta

7

uso this.myObjB en lugar de myObjB var

3

Object literals:

var objA = { 
    myObjB: { 
     testPrint: function(){ 
      print("Inside test print"); 
     } 
    } 
}; 

objA.myObjB.testPrint(); 
+0

¿Quién vota esta respuesta? Esta es una respuesta perfectamente válida, solo falta "objA.myObjB.testPrint()"! –

+0

Cuando nos referimos a "this" dentro del método testPrint, ¿nos estamos refiriendo a myObjB u objA? – Slavo

+0

Para responder a mi pregunta anterior, es objA, por lo que no parece una buena implementación de espacios de nombres. – Slavo

1

Si usted está tratando de hacer la herencia entonces es posible que desee considerar la prototipo palabra clave.

var myObjB = function(){ 
    this.testPrint = function() { 
     print (" Inside testPrint "); 
    } 
} 

var myObjA = new myObjB(); 
myObjA.prototype = { 
    var1 : "hello world", 
    test : function(){ 
     this.testPrint(this.var1); 
    } 
} 

(espero que tenía sentido)

1

Su definición de la testa no exponer a los miembros públicos. Para exponer myObjB, tiene que hacerlo público:

function TestA() { 
    this.myObjB = new TestB(); 
} 
var objA = new TestA(); 
var objB = objA.myObjB; 
10

Si desea que el prototipo de definición de las clases anidadas interiores para no ser accesible desde fuera de la clase externa, así como una aplicación OO aspirador, lleve una mira este.

var BobsGarage = BobsGarage || {}; // namespace 

/** 
* BobsGarage.Car 
* @constructor 
* @returns {BobsGarage.Car} 
*/ 
BobsGarage.Car = function() { 

    /** 
    * Engine 
    * @constructor 
    * @returns {Engine} 
    */ 
    var Engine = function() { 
     // definition of an engine 
    }; 

    Engine.prototype.constructor = Engine; 
    Engine.prototype.start = function() { 
     console.log('start engine'); 
    }; 

    /** 
    * Tank 
    * @constructor 
    * @returns {Tank} 
    */ 
    var Tank = function() { 
     // definition of a tank 
    }; 

    Tank.prototype.constructor = Tank; 
    Tank.prototype.fill = function() { 
     console.log('fill tank'); 
    }; 

    this.engine = new Engine(); 
    this.tank = new Tank(); 
}; 

BobsGarage.Car.prototype.constructor = BobsGarage.Car; 

/** 
* BobsGarage.Ferrari 
* Derived from BobsGarage.Car 
* @constructor 
* @returns {BobsGarage.Ferrari} 
*/ 
BobsGarage.Ferrari = function() { 
    BobsGarage.Car.call(this); 
}; 
BobsGarage.Ferrari.prototype = Object.create(BobsGarage.Car.prototype); 
BobsGarage.Ferrari.prototype.constructor = BobsGarage.Ferrari; 
BobsGarage.Ferrari.prototype.speedUp = function() { 
    console.log('speed up'); 
}; 

// Test it on the road 

var car = new BobsGarage.Car(); 
car.tank.fill(); 
car.engine.start(); 

var ferrari = new BobsGarage.Ferrari(); 
ferrari.tank.fill(); 
ferrari.engine.start(); 
ferrari.speedUp(); 

// var engine = new Engine(); // ReferenceError 

console.log(ferrari); 

De esta manera se puede tener herencia de prototipo y clases anidadas por lo que las clases definidas dentro BobsGarage.Car no son accesibles fuera del constructor del BobsGarage.Car pero las instancias de ellos son accesibles para las clases derivadas, como se muestra en la prueba código.

Nota: Me refiero al concepto de Clase en Javascript como se define en el MDN.

Cuestiones relacionadas