2010-11-07 6 views
12

मैं सामान्य रूप से ExtJS और ऑब्जेक्ट उन्मुख जावास्क्रिप्ट सीखने की कोशिश कर रहा हूं। मैंने लोगों को कस्टम नामस्थानों में कक्षाओं को दो तरीकों से परिभाषित किया है। इन दो तरीकों के बीच क्या अंतर है?ExtJS 3: कस्टम क्लास बनाने के दो तरीके: क्या अंतर है?

विधि 1

Ext.ns('myapp.cars'); 
(function(){ 
    var Car = Ext.extend(Object, { 
     //... 
    }) 

    myapp.cars.Car = Car; 
})() 

विधि 2

Ext.ns('myapp.cars'); 
myapp.cars.Car = Ext.extend(Object, { 
     //... 
}); 

विधि 2 पढ़ने में आसान है और कम कोड की आवश्यकता है; क्या कोई कारण है विधि 1 बेहतर है? धन्यवाद!

+1

क्या आपका मतलब है कि विधि 2 पढ़ने के लिए आसान है और कम कोड की आवश्यकता है? – fijiaaron

+0

@ फिजियारोन हाँ! सही किया। –

उत्तर

6

यह मूल रूप से वही है, सिवाय इसके कि आप पहली विधि के स्वयं-निष्पादन समारोह में निजी चर का उपयोग कर सकते हैं, जबकि आप केवल दूसरे चर में वैश्विक चर परिभाषित कर सकते हैं।

उदाहरण के लिए:

Ext.ns('myapp.cars'); 
(function(){ 

    var carInfo = { 
     goodEngine: true 
    }; 

    var Car = Ext.extend(Object, { 
     info: carInfo 
    }); 

    myapp.cars.Car = Car; 
})() 

// carInfo is undefined here, so this will give an error 
alert(carInfo.goodEngine); 

तो, पहली विधि यदि आप वेरिएबल कि आप बाद में उपयोग नहीं होगा की एक बंज के साथ काम काफी उपयोगी है।

+0

यह पैटर्न का मेरा पसंदीदा कार्यान्वयन है, हालांकि मुझे एक चीज़ के साथ परेशानी हो रही है ... @ हार्मन मेरे पास एक प्रश्न है, यदि मैं एक एक्स्ट क्लास का विस्तार कर रहा हूं, उदाहरण के लिए 'var MyWindowClass = Ext.extend (Ext। विंडो, {...}); ' क्या आप जानते हैं कि मैं 'MyWindowClass' में घोषित डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कैसे कर सकता हूं और फिर, यदि मैं आगे बढ़ाता हूं (यानी' var MySuperWindowClass = Ext.extend (myapp.MyWindowClass, {.. ।}); ') फिर से डिफ़ॉल्ट कॉन्फ़िगरेशन घोषित करें जो MyWindowClass में डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ लागू किया जाएगा? – blong

6

निम्नलिखित व्यावहारिक रूप से बराबर हैं:

var Car = Ext.extend(Object, { 
    //... 
}); 

myapp.cars.Car = Car; 

... और:

myapp.cars.Car = Ext.extend(Object, { 
    //... 
}); 

पहले उदाहरण में आप एक अस्थायी चर का उपयोग किया था नव निर्मित वस्तु के लिए एक संदर्भ पकड़ करने के लिए , जिसे तब myapp.cars.Car पर कॉपी किया गया है (संदर्भ कॉपी किया गया है, ऑब्जेक्ट नहीं)। दूसरे उदाहरण में आप ऑब्जेक्ट का संदर्भ सीधे myapp.cars.Car पर निर्दिष्ट करेंगे।

आपका पहला उदाहरण स्व-चालान रहित अज्ञात फ़ंक्शन (function(){ })() में संलग्न था क्योंकि उस अस्थायी चर के दायरे को सीमित करना है। आमतौर पर उस Car चर के साथ वैश्विक नामस्थान को प्रदूषित न करने के लिए किया जाता है। यदि कोई अन्य Car परिवर्तनीय परिभाषित किया गया था, तो यह इस के साथ संघर्ष नहीं करेगा। उदाहरण:

var Car = "My Nice Car"; 

(function(){ 
    var Car = Ext.extend(Object, { 
     //... 
    }); 

    myapp.cars.Car = Car; 
})(); 

alert(Car); // Still "My Nice Car" 
      // No conflict with the `Car` variable in the self invoking function. 
संबंधित मुद्दे