2008-10-09 10 views
5

मैं जावा स्क्रिप्ट में नेस्टेड क्लास को कैसे परिभाषित करूं।जावास्क्रिप्ट नेस्टेड क्लास

यहाँ मैं कोड का टुकड़ा है:

objA = new TestA(); 

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

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

अब मैं objA

objA.myObjB.testPrint(); 

लेकिन इसकी दे त्रुटि का उपयोग कर testPrint का उपयोग करने की कोशिश कर रहा हूँ

कैसे "objA कोई प्रॉपर्टी नहीं है" क्या मैं obja हैंडलर का उपयोग कर testB विधि तक पहुंच सकता हूं?

उत्तर

3

Object literals के बजाय this.myObjB:

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

objA.myObjB.testPrint(); 
+0

किसने इसे वोट दिया? यह एक पूरी तरह से वैध उत्तर है, केवल "objA.myObjB.testPrint()" गायब है! –

+0

जब हम testPrint विधि के अंदर "यह" देखते हैं, तो क्या हम myObjB या objA का जिक्र कर रहे हैं? – Slavo

+0

मेरे पिछले प्रश्न का उत्तर देने के लिए - यह objA है, इसलिए यह नामस्थानों के अच्छे कार्यान्वयन की तरह प्रतीत नहीं होता है। – Slavo

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

टेस्टा की आपकी परिभाषा भी सार्वजनिक सदस्यों का खुलासा नहीं करता।

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

आप भीतरी नेस्टेड वर्गों के प्रोटोटाइप परिभाषा बाहरी कक्षा के बाहर से सुलभ नहीं है, साथ ही एक क्लीनर OO कार्यान्वयन होना चाहते हैं, एक ले: myObjB का पर्दाफाश करने के लिए, आप इसे सार्वजनिक करने की जरूरत है इसे देखो।

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 के निर्माता के बाहर सुलभ नहीं हैं, लेकिन जैसा कि परीक्षण में दिखाया गया है उनमें से उदाहरणों, व्युत्पन्न वर्ग की पहुंच में हैं हो सकता है कोड।

नोट: पर परिभाषित जावास्क्रिप्ट में कक्षा की अवधारणा का जिक्र कर रहा हूं।

संबंधित मुद्दे