2012-11-07 20 views
10

बच्चे में पैरेंट कन्स्ट्रक्टर को कॉल करने के 2 तरीके हैं।कॉलिंग बेस कन्स्ट्रक्टर - जावास्क्रिप्ट

var A = function A() { 
    this.x = 123; 
}; 

var B = function B() { 

    // 1. call directly 
    A.call(this); 

    // 2. call from prototype 
    A.prototype.constructor.call(this); 
}; 

B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B; 

क्या कोई ऐसी स्थितियां हैं जब कोई दूसरे से सुरक्षित/बेहतर होगा, या वे हमेशा बराबर हैं?

+0

आपको दूसरे संस्करण का उपयोग करने के लिए क्या मजबूर होगा? आप एक ही समारोह में जाने के लिए बस एक लंबा रास्ता ले रहे हैं। –

+0

शायद ऐसी स्थिति जहां 'ए' को किसी अन्य वस्तु से एक निर्माता बनाया गया हो? –

+0

ठीक है, लेकिन फिर दो कॉल बराबर नहीं हैं। आप दो अलग-अलग स्थितियों के बारे में बात कर रहे हैं। –

उत्तर

15

यह हमेशा निम्नलिखित कारणों के लिए सीधे आधार निर्माता उपयोग करना बेहतर है:

  1. यह तेज़ है। दुभाषिया को prototype.constructor तक पहुंचने की आवश्यकता नहीं है।
  2. यह सुरक्षित है। नीचे दिए गए कार्यक्रम पर विचार करें। C से

A इनहेरिट करती है, लेकिन मैं A.prototype.constructorA वापस करने के लिए सेट करने के लिए भूल गया था। तो अब यह C पर इंगित करता है। यदि हम दूसरी विधि का उपयोग करते हैं तो B में समस्याएं उत्पन्न होती हैं:

var C = function C() { 
    // some code 
}; 

var A = function A() { 
    this.x = 123; 
}; 

A.prototype = Object.create(C.prototype); 
// I forgot to uncomment the next line: 
// A.prototype.constructor = A; 

var B = function B() { 

    // 1. call directly 
    A.call(this); 

    // 2. call from prototype 
    A.prototype.constructor.call(this); // A.prototype.constructor is C, not A 
}; 

B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B;