पायथन पृष्ठभूमि से आते हुए, मैंने इसे पढ़ा है, जावास्क्रिप्ट सीखना:
कक्षाएं वास्तव में "विशेष कार्य" हैं, और जैसे आप फ़ंक्शन एक्सप्रेशन और फ़ंक्शन घोषणाओं को परिभाषित कर सकते हैं, वैसे ही क्लास सिंटैक्स में दो घटक होते हैं: क्लास एक्सप्रेशन और क्लास डिक्लेरेशन।
dev.mozilla वेबसाइट पर..
मैं जो समझता हूं वह यह है:
ओओपी में कार्य वस्तुएं हैं
और क्लास फंक्शन नहीं हैं।
और हो सकता है कि कक्षाएं स्वयं वस्तुएं हों। मुझे यकीन नहीं है।
क्या मै गलत हु?
1 उत्तर
कक्षाएं वास्तव में कार्य हैं, और कार्य भी वस्तुएं हैं - आप वस्तुओं की तरह ही कार्यों पर मनमाने ढंग से कुंजी-मूल्य जोड़े डाल सकते हैं।
class X{}
console.log(typeof X);
console.log(X instanceof Object);
यह एक वर्ग घोषणा है। एक वर्ग अभिव्यक्ति की तरह है:
const TheX = class X{}
console.log(typeof TheX);
console.log(TheX instanceof Object);
जब किसी वर्ग में सीधे कुंजी-मूल्य जोड़े होते हैं (किसी वस्तु की तरह), तो गुणों को आम तौर पर "स्थैतिक" कहा जाता है:
class X{
static prop = 'foo';
}
console.log(X.hasOwnProperty('prop'));
class
के साथ बनाई गई कक्षाओं को new
के बिना नहीं बुलाया जा सकता है, लेकिन function
के साथ बनाई गई कक्षाएं (जिस स्थिति में यह एक मानक फ़ंक्शन के बराबर है) कर सकती हैं।
function X() {
}
// As a class:
const x = new X();
// As an ordinary function:
const somethingElse = X();
function
सिंटैक्स के साथ, फ़ंक्शन एक वर्ग के रूप में व्यवहार करता है या एक सादे फ़ंक्शन के रूप में कॉलर द्वारा निर्धारित किया जाता है - new
का उपयोग किया जाता है या नहीं। यदि new
का उपयोग किया जाता है, तो फ़ंक्शन के अंदर this
को X.prototype
से विरासत में मिली वस्तु के रूप में सेट किया जाता है, जो अंत में स्वचालित रूप से वापस आ जाती है। यदि new
का उपयोग नहीं किया जाता है, तो फ़ंक्शन के अंदर this
कॉलिंग संदर्भ पर सेट है यदि कोई है (उदाहरण के लिए someObj.X()
में this
someObj
होगा) .
this
क्लास में ही क्लास ऑब्जेक्ट की ओर इशारा करता है, जबकि फंक्शन में यह उसके पैरेंट की ओर इशारा करता है?
this
का निर्धारण इस बात से होता है कि इसे कैसे कहा जाता है। new X()
X को एक वर्ग की तरह बुलाता है, जो इसे X.prototype
से विरासत में मिली वस्तु का this
देता है। X()
(जब X को class
सिंटैक्स के बजाय फ़ंक्शन सिंटैक्स के साथ घोषित किया जाता है) इसके परिणामस्वरूप यह एक सामान्य फ़ंक्शन की तरह व्यवहार करता है।
constructor
फ़ंक्शन देता है। यही कारण है कि एक वर्ग घोषणा फहराया.
let
और const
के साथ इनलाइन, यह सहज नहीं है और बग-प्रवण होगा (2) वर्ग घोषणाओं के दुष्प्रभाव हो सकते हैं (उनके स्थिर गुणों में)
class
को इंस्टेंट करते समय आपकोnew
का उपयोग करना होगा। आप एक सामान्य फ़ंक्शन की तरहclass
को कॉल नहीं कर सकते।function
है तोclass
कीवर्ड का क्या उद्देश्य है? कंसोल इसे फ़ायरफ़ॉक्स में स्वीकार करता है।class
कीवर्ड को प्राथमिकता देनी चाहिए। यदि आप सामान्य कार्यों की तरह कुछ चाहते हैं तो आपको विधियों या तीर कार्यों का उपयोग करना चाहिए। एकfunction
सामान्य कार्यों के रूप में या कक्षाओं के सीमित रूप के रूप में व्यवहार कर सकता है (उदाहरण के लिए मूल वर्गों को उप-वर्गीकरण पूरी तरह से संभव नहीं है, कोई निजी क्षेत्र नहीं है, ...), और वे अब बहुत उपयोगी नहीं हैं (ईसीएमएस्क्रिप्ट 2015 से पहले, यह एकमात्र प्रकार का कार्य था)।