2008-10-09 5 views
5

Как определить вложенный класс в Java Script.Вложенный класс Javascript

Вот фрагмент кода, у меня есть:

objA = new TestA(); 

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

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

Теперь я пытаюсь получить доступ к testPrint с помощью objA

objA.myObjB.testPrint(); 

Но его дает ошибку "objA не имеет свойства"

Как могу ли я получить доступ к методу testB с помощью обработчика objA?

ответ

7

использование this.myObjB вместо вар myObjB

3

Object literals:

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

objA.myObjB.testPrint(); 
+0

Кто проголосовал за это? Это абсолютно правильный ответ, отсутствующий только «objA.myObjB.testPrint()»! – 2008-10-09 02:27:29

1

Если вы пытаетесь сделать наследство, то вы можете рассмотреть прототип ключевого слова.

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

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

(я надеюсь, что имело смысл)

1

Ваше определение Testa не выставляет никаких публичных членов. Выставить myObjB, что вам нужно сделать общедоступным:

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

Если вы хотите, определение прообраза внутренних вложенных классов, чтобы быть не доступно снаружи внешнего класса, а также внедрения чистого OO, взять посмотри на это.

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

Таким образом, вы можете иметь прототип наследования и вложенные классы так, чтобы классы, определенные в BobsGarage.Car не доступны за пределами конструктора BobsGarage.Car но экземпляры из них доступны для производных классов, как показано в тесте код.

Примечание: Я имею в виду понятие Класс в Javascript, как определено на MDN.

Смежные вопросы