[ACCEPTED]-Javascript nested class-javascript

Accepted answer
Score: 11

If you want the prototype definition of 10 the inner nested classes to be not accessible 9 from outside the outer class, as well as 8 a cleaner OO implementation, take a look 7 at this.

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);

This way you can have prototype inheritance and nested classes so that 6 classes defined within BobsGarage.Car are not accessible 5 outside the constructor of BobsGarage.Car but instances 4 of them are accessible to derived classes, as 3 shown in the test code.

Note: I am referring 2 to the concept of Class in Javascript as defined 1 on the MDN.

Score: 7

use this.myObjB instead of var myObjB

0

Score: 3

Object literals:

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

objA.myObjB.testPrint();

0

Score: 1

If you're trying to do inheritance then 2 you may want to consider the prototype keyword.

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

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

(i 1 hope that made sense)

Score: 1

Your definition of TestA does not expose 2 any public members. To expose myObjB, you 1 need to make it public:

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

this is another way to do that.

class A {
  constructor(classB) {
    this.ObjB = classB
  }
}

class B {
  Hello() {
    console.log("Hello from class B")
  }
}

let objA = new A(new B())

objA.ObjB.Hello()

0

More Related questions