2015-06-25 3 views
9

के उदाहरण के लिए, करते हैं, एक Dog वर्ग:अज्ञात फ़ंक्शन में टाइपस्क्रिप्ट रैप क्लास क्यों करता है?

class Dog { 
    static food; 
    private static static_var = 123; 

    constructor(private name) {} 

    speak() { 
     console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var); 
    } 
} 

जे एस को संकलित:

var Dog = (function() { 
    function Dog(name) { 
     this.name = name; 
    } 

    Dog.prototype.speak = function() { 
     console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var); 
    }; 

    Dog.static_var = 123; 
    return Dog; 
})(); 

यह समान रूप से अच्छी तरह से काम करता है और कम जटिल है: (

function Dog(name) { 
    this.name = name; 
} 

Dog.prototype.speak = function() { 
    console.log(this.name + ', I eat ' + Dog.food + ', ' + Dog.static_var); 
}; 

Dog.static_var = 123; 

वहाँ किसी भी है अज्ञात फ़ंक्शन रैपर का उपयोग करने के कारण "सौंदर्यशास्त्र" के अलावा)?

+0

'कक्षा' टाइपस्क्रिप्ट में एक अभिव्यक्ति है, है ना? – Bergi

+0

मुझे उम्मीद है कि कक्षा के भीतर जो भी परिभाषित किया गया है, उसके दायरे को सीमित करना है। – bhspencer

+0

हां, यही कारण है कि मैंने इसे टाइपस्क्रिप्ट टैग किया। खैर, एक कीवर्ड सटीक होना चाहिए। – MightyPork

उत्तर

6

दोनों के बीच मुख्य अंतर hoisting के साथ करना है।

टाइपस्क्रिप्ट क्लास को एक चर के लिए फ़ंक्शन अभिव्यक्ति के असाइनमेंट में संकलित करता है। इसका मतलब है कि परिणामी कन्स्ट्रक्टर केवल असाइनमेंट के बिंदु पर मौजूद होना शुरू कर देता है। कोड जो पहले होता है, Dogundefined से बाध्य होगा।

दूसरी तरफ, आपका कार्यान्वयन एक सादे फ़ंक्शन का उपयोग करता है जो कि होस्टिंग के अधीन है - उस दायरे में कोई भी कोड, जिसमें फ़ंक्शन से पहले होने वाले कोड शामिल हैं, Dog कन्स्ट्रक्टर का आह्वान कर सकते हैं।

मुझे लगता है कि टाइपस्क्रिप्ट यह सुनिश्चित करने के लिए पसंद करता है कि एक वर्ग वास्तव में परिभाषित होने से पहले मौजूद नहीं है, संभवत: उसी दायरे में कई बिंदुओं पर कक्षा को फिर से परिभाषित करने की अनुमति देने के लिए।

+0

एकमात्र अन्य चीज़ जो मैं इसमें जोड़ सकता हूं वह यह है कि बड़े वर्गों में - प्रश्न में प्रदान किए गए किसी की तरह नहीं - कमीशन के परिणामस्वरूप एक छोटी फ़ाइल होगी क्योंकि बंद होने में सभी चर को कम किया जाएगा। –

+0

@MichaelCoxon आपका मतलब है * निजी * चर, मुझे लगता है? – MightyPork

+0

@MightyPork हाँ, और सभी वर्ग नाम संदर्भ –

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