2012-10-02 19 views
17

मैं माइक्रोसॉफ्ट से TypeScript नामक नई जावास्क्रिप्ट जैसी भाषा के बारे में पढ़ रहा था। playground (example section) में, टाइपस्क्रिप्ट सिंटैक्स में जावास्क्रिप्ट कोड में परिवर्तित एक साधारण वर्ग है। जावा प्रोग्रामिंग पृष्ठभूमि से आ रहा है, यह जानने के लिए दिलचस्प था कि टाइपस्क्रिप्ट से संकलित के रूप में जावास्क्रिप्ट में ओओपी कैसे किया जाता है।एक अज्ञात फ़ंक्शन() कॉल में जावास्क्रिप्ट क्लास को एम्बेड क्यों करें?

टाइपप्रति कोड:

class Greeter { 
    greeting: string; 
    constructor (message: string) { 
     this.greeting = message; 
    } 
    greet() { 
     return "Hello, " + this.greeting; 
    } 
} 

var greeter = new Greeter("world"); 

var button = document.createElement('button') 
button.innerText = "Say Hello" 
button.onclick = function() { 
    alert(greeter.greet()) 
} 

document.body.appendChild(button) 

और बराबर जावा स्क्रिप्ट कोड:

var Greeter = (function() { 
    function Greeter(message) { 
     this.greeting = message; 
    } 
    Greeter.prototype.greet = function() { 
     return "Hello, " + this.greeting; 
    }; 
    return Greeter; 
})(); 
var greeter = new Greeter("world"); 
var button = document.createElement('button'); 
button.innerText = "Say Hello"; 
button.onclick = function() { 
    alert(greeter.greet()); 
}; 
document.body.appendChild(button); 

टाइपप्रति हिस्सा बहुत जावा के समान तो मुझे लगा कि समझते हैं। अब मेरा सवाल है कि जावास्क्रिप्ट में Greeter वर्ग का शरीर अज्ञात function() कॉल में एम्बेड किया गया है?

ऐसा क्यों नहीं लिखते?

function Greeter(message) { 
    this.greeting = message; 
} 
Greeter.prototype.greet = function() { 
    return "Hello, " + this.greeting; 
}; 

प्रत्येक विधि का लाभ/नुकसान क्या है?

+0

कि जावास्क्रिप्ट कोड तुरंत लागू किए गए अज्ञात फ़ंक्शन का कोई विशेष उपयोग नहीं करता है। आप सही हैं, इसे हटाया जा सकता है। –

+1

मैंने सोचा कि यह 'निजी' सदस्यों के लिए होगा, लेकिन ... 'निजी' जोड़ना कुछ भी नहीं बदलेगा। इस मामले में –

उत्तर

13

निम्नलिखित एक तुरंत लागू समारोह अभिव्यक्ति कहा जाता है:

(function(){ ... })(); 

यह वैश्विक गुंजाइश साफ रखने के लिए प्रयोग किया जाता है। हालांकि, इस मामले में यह आवश्यक नहीं है क्योंकि वापसी मूल्य एक चर Greeter को असाइन किया गया है। जब आप "निजी" स्थिर सदस्यों को चाहते हैं तो यह पैटर्न उपयोगी होने का एकमात्र समय है।

उदा .:

var Greeter = (function() { 
    var foo = 'foo', bar = 'bar'; /* only accessible from function's defined 
            in the local scope ... */ 

    function Greeter(message) { 
     this.greeting = message; 
    } 
    Greeter.prototype.greet = function() { 
     return "Hello, " + this.greeting; 
    }; 
    return Greeter; 
})(); 
+0

'foo' और' bar' निजी और स्थिर होंगे। –

2

गुमनाम समारोह/स्वयं को क्रियान्वित बंद आम तौर पर गुंजाइश संपुटित करने के लिए इतना है कि केवल दिए गए मान यह के बाहर से पहुंचा है प्रयोग किया जाता है। (या जो कुछ भी आप अन्य वस्तुओं से जोड़ते हैं, खिड़की की तरह)

1

अज्ञात फ़ंक्शन शायद कोड के अन्य हिस्सों के साथ नाम संयोजन को रोकने के लिए है। इस तरह से सोचें, आपके अज्ञात फ़ंक्शन के अंदर, आप जो कुछ भी चाहते हैं उसे "$" नामक एक चर घोषित कर सकते हैं, और साथ ही, बिना किसी संघर्ष के अपने कोड के अन्य हिस्सों पर jQuery का उपयोग कर सकते हैं।

+1

हालांकि, यह वही नाम असाइन कर रहा है। –

+0

मुझे समझ में नहीं आता कि इसका मतलब क्या है .... क्या आप टिप्पणी पर थोड़ा और विस्तार कर सकते हैं? – Deleteman

2

यह निजी सदस्यों की अनुमति है। इस उदाहरण में, सभी सदस्य सार्वजनिक हैं इसलिए आपके दो निर्माण समकक्ष हैं। हालांकि, अगर आप निजी सदस्यों को प्रदान करना चाहते हैं तो आपको उन्हें बंद करने के माध्यम से कॉलिंग स्कोप से छिपाने की जरूरत है। तुम इतनी तरह एक निजी सदस्य है इस प्रकार है:

class Greeter { 
    private greeting: string; 
    constructor (message: string) { 
     this.greeting = message; 
    } 
    greet() { 
     return "Hello, " + this.greeting; 
    } 
} 

आप शायद कुछ इस तरह मिलेगा:

var Greeter = (function() { 
    var greeting=""; 
    function Greeter(message) { 
     greeting = message; 
    } 
    Greeter.prototype.greet = function() { 
     return "Hello, " + greeting; 
    }; 
    return Greeter; 
})(); 

ग्रीटिंग चर गुमनाम समारोह के अंदर परिभाषित किसी भी कार्य करने के लिए उपलब्ध हो जाएगा, लेकिन हर जगह अदृश्य अन्य।

+1

नहीं, यह नहीं है। 'var ग्रीटिंग' नहीं बनाया गया है यह केवल आंतरिक उपयोग किया जाता है। मैंने बस कोशिश की;) – PiTheNumber

+0

आपने सोचा होगा कि आपको ऐसा कुछ मिल जाएगा, लेकिन आप नहीं करते हैं। टाइपस्क्रिप्ट केवल 'निजी' संशोधक को संकलित समय पर लागू करता है, इसलिए जब भी आप इसका उपयोग करते हैं, तब भी यह 'this.greeting' सेट करता है (जो स्पष्ट रूप से निजी नहीं है - लेकिन यदि आप इसे एक्सेस करने का प्रयास करते हैं तो आपका टाइपस्क्रिप्ट संकलित नहीं होगा)। –

+0

आह तो मुझे लगता है कि ढांचे द्वारा उत्पन्न कुछ छुपे हुए गुण हैं, जो परिणामस्वरूप ऑब्जेक्ट को प्रदूषित नहीं करना चाहिए, न केवल निजी सदस्यों –

3

स्पष्ट स्कोपिंग/बंद तर्क के अलावा। अज्ञात फ़ंक्शन का उपयोग करना जो स्वयं को तुरंत कॉल करता है, कक्षा परिभाषा को तुरंत लोड करता है (व्याख्या करता है)। यह निष्पादन के भीतर किसी भी जेआईटी अनुकूलन को आगे लोड करने की अनुमति देता है। संक्षेप में, अधिक जटिल अनुप्रयोगों के लिए यह प्रदर्शन में सुधार करेगा।

var w = new Greeter("hello") 

अन्य तरीकों रहे हैं लेकिन सभी जटिल और सीमाएं और कमियां के साथ:

+4

क्या आप जेआईटी भाग के बारे में अधिक जानकारी के साथ एक स्रोत से लिंक कर सकते हैं? – Ciddan

-4

बंद मानकों के साथ कंस्ट्रक्टर कॉल करने के लिए एकमात्र मतलब है।

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