2016-03-25 6 views
7

इस टाइपप्रति कोड को देखते हुए:टाइपस्क्रिप्ट एक कक्षा के लिए आईआईएफई उत्पन्न क्यों कर रहा है?

var Greeter = (function() { 
    function Greeter() { 
    } 
    Greeter.prototype.greet = function() { }; 
    return Greeter; 
}()); 

लाभ यहाँ क्या है:

class Greeter { 
    greet() {} 
} 

यह एक Iife (तुरंत-लागू समारोह अभिव्यक्ति) निर्माता समारोह के आसपास है और जैसे सभी प्रोटोटाइप समारोह घोषणाओं उत्पन्न करता है? जब भी मैंने आईआईएफई के बारे में पढ़ा तो मुझे मॉड्यूल को परिभाषित करने में बहुत अधिक उपयोग दिखाई देता है। जहां तक ​​मैं देख सकता हूं कि टाइपस्क्रिप्ट आईआईएफई के अंदर कुछ भी उत्पन्न नहीं करता है जो वैश्विक नामस्थान को प्रदूषित करेगा।

var Greeter = function() {} 
Greeter.prototype.greet = function() { }; 

यह क्या कारण है:

मेरी राय में इस वर्ग के घोषणा पर कोई लाभ नहीं है?

+0

शायद टाइपप्रति के कोड को आसान बनाने की तो यह है जब यह एक Iife की जरूरत है या नहीं, कि लाभ यह अनुमान लगाने का नहीं है। यह वास्तव में कोई फर्क नहीं पड़ता, है ना? यदि यह हाथ से लिखित कोड था, तो आपके पास –

+1

एक बिंदु अधिक होगा जो इस प्रश्न को बंद करने के लिए मतदान करने वाले लोगों के लिए: यह राय आधारित नहीं है। टीएस कंपाइलर इस तरह से करता है, और सवाल यही है। मुझे लगता है कि इस निर्णय के पीछे कम से कम कुछ कारण है। – Tarion

उत्तर

6

यह दिलचस्प है। मुझे लगता है कि टाइपस्क्रिप्ट कंपाइलर ClassDeclaration संकलित करता है ClassExpression एस से घटाकर, दायरे में एक चर को अभिव्यक्ति निर्दिष्ट करके, इसलिए उन्हें स्वतंत्र रूप से उन मामलों को संभालने की आवश्यकता नहीं है। यह टाइपस्क्रिप्ट कंपाइलर को सरल बनाता है, और जेनरेट कोड को कुछ मॉड्यूलर बनाता है (मैं अधिक पठनीय कहूंगा, लेकिन यह सिर्फ स्वाद का मामला है)।

class Bar { }; 
foo(class Baz { }); 
var Baa = class Bab { }; 

संकलित में:

var Bar = (function() { 
    function Bar() { 
    } 
    return Bar; 
}()); 
; 
foo((function() { 
    function Baz() { 
    } 
    return Baz; 
}())); 
var Baa = (function() { 
    function Bab() { 
    } 
    return Bab; 
}()); 

देखें, ClassDeclaration एक ClassExpression एक स्थानीय चर करने के लिए सौंपा के रूप में संकलित किया गया है।

9

वैश्विक नामस्थान प्रदूषण से बचने के लिए।

यह एक क्लोजर पैटर्न है जहां आंतरिक कार्यों में उनके माता-पिता गुणों तक पहुंच होती है। आईआईएफई द्वारा, आंतरिक कार्यों के संदर्भ में लौटाया गया।

  1. वंशानुक्रम कार्यान्वयन: जहां यह Iife लिए एक तर्क के रूप BaseClass गुजरता

    नीचे दो स्थितियों में, जहां Iife पैटर्न काफी उपयोगी और कारण है, क्यों टाइपप्रति संकलक Iife पैटर्न उत्पन्न कर रहे हैं। यदि आईआईएफईई BaseClass वैश्विक चर नहीं होगा, इस प्रकार वैश्विक नामस्थान प्रदूषित होगा।

टाइपप्रति:

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

जे एस:

var Greeter = (function(_super) { 
    __extends(Greeter, _super); 

    function Greeter(message) { 
     this.greeting = message; 
    } 
    Greeter.prototype.greet = function() { 
     return "Hello, " + this.greeting; 
    }; 
    return Greeter; 
}(BaseController)); 
  1. मॉड्यूल पैटर्न कार्यान्वयन: जहां ऐप की तरह केवल एक वैश्विक चर है ' ऐप 'और अन्य सभी फीचर्स app.cart, app.catalog इत्यादि जैसी वस्तुओं में लिपटे हैं। मॉड्यूल के माध्यम से केवल वैरिएबल का खुलासा किया जाता है और अन्य सभी फीचर्स मॉड्यूल में ही जोड़े जाते हैं, जो केवल आईआईएफई द्वारा संभव है।

टाइपप्रति:

module App.Controller { 
    export class Greeter extends BaseController { 
     greeting: string; 
     constructor(message: string) { 
      this.greeting = message; 
     } 
     greet() { 
      return "Hello, " + this.greeting; 
     } 
    } 
} 

जे एस:

var App; 
(function (App) { 
    var Controller; 
    (function (Controller) { 
     var Greeter = (function (_super) { 
      __extends(Greeter, _super); 
      function Greeter(message) { 
       this.greeting = message; 
      } 
      Greeter.prototype.greet = function() { 
       return "Hello, " + this.greeting; 
      }; 
      return Greeter; 
     }(BaseController)); 
     Controller.Greeter = Greeter; 
    })(Controller = App.Controller || (App.Controller = {})); 
})(App || (App = {})); 

कॉपी/पेस्ट इस ब्राउज़र कंसोल और केवल अनुप्रयोग चर करने के लिए कोड जे एस विश्व स्तर पर बनाया जाएगा। बाकी कार्यक्षमता ऐप के तहत होगी।

धन्यवाद, mkdudeja

+1

ओपी ने कहा कि कोड वैश्विक नामस्थान को प्रदूषित नहीं करेगा, और मैं नहीं देखता कि यह वैश्विक नामस्थान को कैसे प्रदूषित करेगा। कृपया क्या आप स्पष्टीकरण दे सकते हैं? –

+0

सिर्फ इसलिए कि आंतरिक फ़ंक्शन का संदर्भ तुरंत उसी नाम के साथ एक चर के लिए असाइन किया गया है –

+0

यदि आप सही हैं, तो कृपया एक उदाहरण खोजें जो वैश्विक नामस्थान को प्रदूषित करेगा। कक्षा के सभी परिवर्तनीय घोषणा प्रोटोटाइप पर होती है। मैंने टाइपस्क्रिप्ट क्लास प्रलेखन के माध्यम से पढ़ा और कुछ भी नहीं मिला। – Tarion

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

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