2012-05-21 9 views
14

मैं हाल ही में Node.js सीख रहा हूं। मेरे पास Node.js. में फ़ंक्शन util.inherits फ़ंक्शन के बारे में कोई प्रश्न है क्या मैं इसे बदलने के लिए कॉफ़ीस्क्रिप्ट में extends का उपयोग कर सकता हूं? यदि नहीं, तो उनके बीच क्या अंतर है?codefecript में 'extends' और node.js में 'util.inherits' के बीच मतभेद

उत्तर

23

हां, आप इसके स्थान पर extends का उपयोग कर सकते हैं।

अंतर के लिए? के CoffeeScript पर एक नज़र साथ शुरू करते हैं:

class B extends A 

के इस जावास्क्रिप्ट के लिए the JavaScript the CoffeeScript compiler produces पर नजर डालते हैं:

var B, 
    __hasProp = {}.hasOwnProperty, 
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; 

B = (function(_super) { 

    __extends(B, _super); 

    function B() { 
    return B.__super__.constructor.apply(this, arguments); 
    } 

    return B; 

})(A); 

तो, __extendsB और A के बीच inheritence संबंध घोषित करने के लिए प्रयोग किया जाता है।

के __extends थोड़ा अधिक readably को फिर से, CoffeeScript में करते हैं:

coffee__extends = (child, parent) -> 
    child[key] = val for own key, val of parent 

    ctor = -> 
    @constructor = child 
    return 
    ctor.prototype = parent.prototype 

    child.prototype = new ctor 
    child.__super__ = parent.prototype 

    return child 

(आप देख सकते हैं कि इस compiling it back to JavaScript द्वारा एक वफादार प्रजनन है।)

यहाँ है क्या हो रहा है:

  1. parent पर सीधे मिली सभी कुंजियां child पर सेट की गई हैं।
  2. एक नया प्रोटोटाइप कन्स्ट्रक्टर ctor बनाया गया है, इसके उदाहरण constructor गुणों को बच्चे के लिए सेट किया गया है, और इसके prototype माता-पिता को सेट किया गया है।
  3. बाल वर्ग का prototypector के उदाहरण पर सेट है। ctor का constructorchild पर सेट किया जाएगा, और ctor का प्रोटोटाइप स्वयं parent है।
  4. बच्चे वर्ग की __super__ संपत्ति parent की prototype पर सेट की गई है, कॉफीस्क्रिप्ट के super कीवर्ड द्वारा उपयोग के लिए।

node's documentation का वर्णन करता है util.inherits इस प्रकार है:

उत्तराधिकार दूसरे में एक निर्माता से प्रोटोटाइप तरीकों। कन्स्ट्रक्टर का प्रोटोटाइप सुपरकॉन्स्ट्रक्टर से बनाए गए एक नए ऑब्जेक्ट पर सेट किया जाएगा।

अतिरिक्त सुविधा के रूप में, सुपरकॉन्स्ट्रक्टर कन्स्ट्रक्टर के माध्यम से सुलभ होगा .super_ property।

निष्कर्ष में, यदि आप कॉफीस्क्रिप्ट के कक्षाओं का उपयोग कर रहे हैं तो आपको util.inherits का उपयोग करने की आवश्यकता नहीं है; बस सीएस आपको टूल देता है, और आपको super कीवर्ड जैसे बोनस मिलते हैं।

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