2010-04-21 14 views
10

मैं कुछ प्रो जावास्क्रिप्ट डिजाइन पैटर्न से इस समारोह के अंत में यदि खंड को समझने में परेशानी हो रही का विस्तार:जावास्क्रिप्ट विरासत समारोह

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
     superClass.prototype.constructor = superClass; 
    } 
} 

पुस्तक बताते हैं इन लाइनों सुनिश्चित करना है कि कि सुपर क्लास के निर्माता विशेषता सही ढंग से है सेट करें, भले ही सुपरक्लास ऑब्जेक्ट क्लास है। फिर भी, अगर मैं उन तीन लाइनों को छोड़ देते हैं और निम्न करें:

function SubClass() {}; 
extend(SubClass, Object); 

alert(Object.prototype.constructor == Object); 

चेतावनी कहते हैं 'सही', जिसका अर्थ है सुपर क्लास के निर्माता सही ढंग से यहां तक ​​कि उन पिछले तीन लाइनों के बिना स्थापित किया जाएगा। तो क्या स्थितियों के तहत, क्या यह IF कथन कुछ उपयोगी करता है?

धन्यवाद।

+0

मैं एक सवाल है: क्यों मध्यस्थ समारोह एफ, के बजाय सिर्फ subClass.prototype = नई सुपर क्लास() ;? – 755

उत्तर

14

समस्या यह है कि उन दो पंक्तियों से बचने की कोशिश, आम तौर पर उत्पादन किया जाता है जब आप उदाहरण के लिए, एक निर्माता समारोह का prototype संपत्ति की जगह:

function Foo() {}; 
Foo.prototype = { 
    bar: 'baz' 
}; 

var foo = new Foo(); 
foo.constructor === Object; // true, but `constructor` should refer to Foo 

जब functions objects are created, prototype संपत्ति एक नई वस्तु के साथ आरंभ नहीं हो जाता

function Bar() {}; 
var bar = new Bar(); 
bar.constructor === Bar; // true 

जब आप के साथ prototype संपत्ति की जगह: है, जो एक constructor संपत्ति है कि समारोह में ही को संदर्भित करता है, उदाहरण के लिए होता है एक और वस्तु, इस ऑब्जेक्ट में यह constructor संपत्ति है, आमतौर पर अन्य कन्स्ट्रक्टर से विरासत में मिली है, या Object.prototype से।

var newObj = {}; 
newObj.constructor === Object; 

अनुशंसित लेख:

+1

यह मेरे लिए इसे साफ़ करता है। धन्यवाद। इस कोड के लिए लेखकों की व्याख्या भ्रामक है। उन्हें यह कहना चाहिए था कि यह सुनिश्चित करता है कि सुपरक्लास स्वयं को अनुचित रूप से विस्तारित नहीं किया गया है। – Zach

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