सबसे पहले, याद रखें कि क्लास-आधारित भाषा 1 के बजाय जावास्क्रिप्ट मुख्य रूप से एक प्रोटोटाइप भाषा है । एक वर्ग नहीं है, यह एक कार्य है, जो एक वस्तु है। आप उस फ़ंक्शन से किसी ऑब्जेक्ट को कीवर्ड का उपयोग करके तुरंत कर सकते हैं जो आपको मानक ओओपी भाषा में कक्षा के समान कुछ बनाने की अनुमति देगा।Foonew
मैं __proto__ज्यादातर समय यह अनदेखा करने का सुझाव दूंगा क्योंकि इसमें खराब क्रॉस ब्राउज़र समर्थन है, और इसके बजाय यह सीखने पर ध्यान केंद्रित prototypeकरता है कि कैसे काम करता है।
यदि आपके पास किसी फ़ंक्शन 2 से बनाई गई किसी ऑब्जेक्ट का एक उदाहरण है और आप किसी भी तरह से उसके किसी सदस्य (तरीके, गुण, गुण, स्थिरांक आदि) तक पहुंचते हैं, तो पहुंच प्रोटोटाइप पदानुक्रम तक नीचे बह जाएगा, जब तक कि यह (ए) नहीं मिल जाता है सदस्य, या (बी) एक और प्रोटोटाइप नहीं ढूंढता है।
पदानुक्रम उस ऑब्जेक्ट पर शुरू होता है जिसे बुलाया गया था, और फिर अपनी प्रोटोटाइप ऑब्जेक्ट को खोजता है। यदि प्रोटोटाइप ऑब्जेक्ट का प्रोटोटाइप है, तो वह दोहराता है, अगर कोई प्रोटोटाइप मौजूद नहीं है, undefinedतो वापस लौटा दिया जाता है।
उदाहरण के लिए:
foo = {bar: 'baz'};
console.log(foo.bar); // logs "baz"
foo = {};
console.log(foo.bar); // logs undefined
function Foo(){}
Foo.prototype = {bar: 'baz'};
f = new Foo();
console.log(f.bar);
// logs "baz" because the object f doesn't have an attribute "bar"
// so it checks the prototype
f.bar = 'buzz';
console.log( f.bar ); // logs "buzz" because f has an attribute "bar" set
यह मुझे ऐसा लगता है कि आपने कम से कम इन "बुनियादी" भागों को पहले से ही समझ लिया है, लेकिन मुझे यह सुनिश्चित करने के लिए उन्हें स्पष्ट करने की आवश्यकता है।
जावास्क्रिप्ट में, सब कुछ एक वस्तु 3 है ।
सब कुछ एक वस्तु है।
function Foo(){}केवल एक नए फ़ंक्शन को परिभाषित नहीं करता है, यह एक नई फ़ंक्शन ऑब्जेक्ट को परिभाषित करता है जिसका उपयोग करके एक्सेस किया जा सकता है Foo।
यही कारण है कि आप के Fooसाथ प्रोटोटाइप का उपयोग कर सकते हैं Foo.prototype।
आप जो भी कर सकते हैं, उस पर अधिक कार्य सेट किए गए हैं Foo:
Foo.talk = function () {
alert('hello world!');
};
इस नए फ़ंक्शन का उपयोग करके पहुँचा जा सकता है:
Foo.talk();
मुझे उम्मीद है कि अब तक आप एक फंक्शन ऑब्जेक्ट और स्टैटिक मेथड पर फंक्शन्स के बीच समानता नहीं दिखा रहे हैं।
f = new Foo();कक्षा के लिए Foo.prototype.bar = function(){...}एक साझा पद्धति Foo.baz = function(){...}को परिभाषित करने और वर्ग के लिए एक सार्वजनिक स्थैतिक विधि को परिभाषित करने के रूप में एक वर्ग उदाहरण बनाने के बारे में सोचें ।
ECMAScript 2015 ने इस प्रकार की घोषणाओं के लिए विभिन्न प्रकार की सिंथैटिक शुगर पेश की, जो कि उन्हें सरल बनाने के लिए लागू करने के लिए भी आसान थी। पिछले उदाहरण को इस प्रकार लिखा जा सकता है:
class Foo {
bar() {...}
static baz() {...}
}
जो के barरूप में बुलाया जा सकता है:
const f = new Foo()
f.bar()
और इस bazरूप में बुलाया जा सकता है:
Foo.baz()
1: classECMAScript 5 विनिर्देश में "फ्यूचर रिज़र्व्ड वर्ड" था , लेकिन ES6 classकीवर्ड का उपयोग करके कक्षाओं को परिभाषित करने की क्षमता का परिचय देता है ।
2: अनिवार्य रूप से एक निर्माता द्वारा निर्मित एक वर्ग उदाहरण है, लेकिन कई बारीक अंतर हैं जो मैं आपको गुमराह नहीं करना चाहता हूं
3: आदिम मूल्य -जिसमें शामिल हैं undefined, nullबूलियन, संख्या, और तार-तकनीकी रूप से ऑब्जेक्ट नहीं हैं क्योंकि वे निम्न-स्तर के अनुप्रयोग हैं। बूलियन, संख्या और तार अभी भी प्रोटोटाइप श्रृंखला के साथ बातचीत करते हैं जैसे कि वे ऑब्जेक्ट थे, इसलिए इस उत्तर के प्रयोजनों के लिए, उन्हें "ऑब्जेक्ट" पर विचार करना आसान है, भले ही वे काफी नहीं हैं।
Foo.talk = function ...