जावास्क्रिप्ट में कार्यों के रहस्य को सुलझाने में असमर्थ


16

मैं जावास्क्रिप्ट के पर्दे के पर्दे के पीछे समझने की कोशिश कर रहा हूं और वस्तुओं में निर्मित, विशेष रूप से ऑब्जेक्ट और फंक्शन और उनके बीच के संबंध को समझने में अटक गया ।

जब मैंने पढ़ा कि Array, String इत्यादि में निर्मित सभी ऑब्जेक्ट ऑब्जेक्ट से एक्सटेंशन (इनहेरिट की गई) हैं तो मैंने मान लिया कि ऑब्जेक्ट ऑब्जेक्ट में पहला बनाया गया है जो कि निर्मित होता है और बाकी ऑब्जेक्ट इससे प्राप्त होता है। लेकिन इसका कोई मतलब नहीं है जब आपको पता चले कि ऑब्जेक्ट केवल फ़ंक्शन द्वारा बनाए जा सकते हैं, लेकिन फिर फ़ंक्शन भी कुछ नहीं बल्कि फ़ंक्शन की वस्तुएं हैं। यह मुर्गी और मुर्गी की दुविधा की तरह लगने लगा।

दूसरी बेहद भ्रमित करने वाली बात यह है, अगर मैं console.log(Function.prototype)किसी फ़ंक्शन को प्रिंट करता हूं, लेकिन जब मैं प्रिंट console.log(Object.prototype)करता हूं तो वह किसी ऑब्जेक्ट को प्रिंट करता है। Function.prototypeएक समारोह क्यों होता है जब इसे एक वस्तु माना जाता था?

इसके अलावा, मोज़िला प्रलेखन के अनुसार हर जावास्क्रिप्ट वस्तु functionका विस्तार है, Functionलेकिन जब आप console.log(Function.prototype.constructor)इसे फिर से एक समारोह है। अब आप इसे स्वयं बनाने के लिए किसी चीज़ का उपयोग कैसे कर सकते हैं (माइंड = ब्लो)।

अंतिम बात, Function.prototypeएक फ़ंक्शन है लेकिन मैं constructorफ़ंक्शन का उपयोग कर सकता हूं Function.prototype.constructorइसका मतलब Function.prototypeयह है कि फ़ंक्शन एक फ़ंक्शन है जो prototypeऑब्जेक्ट लौटाता है


चूंकि एक फ़ंक्शन एक ऑब्जेक्ट है, इसका मतलब है कि Function.prototypeएक फ़ंक्शन हो सकता है और आंतरिक क्षेत्र हो सकते हैं। तो नहीं, जब आप संरचना से गुजर रहे हैं तो प्रोटोटाइप फ़ंक्शन को निष्पादित नहीं करते हैं। अंत में याद रखें कि जावास्क्रिप्ट की व्याख्या करने वाला एक इंजन है, इसलिए ऑब्जेक्ट और फ़ंक्शन संभवतः इंजन के भीतर बनाए जाते हैं और जावास्क्रिप्ट से नहीं और विशेष संदर्भ जैसे Function.prototypeऔर Object.prototypeबस इंजन द्वारा एक विशेष तरीके से व्याख्या की जा सकती है।
Walfrat

1
जब तक आप एक मानक-अनुरूप जावास्क्रिप्ट कंपाइलर को लागू करने के लिए नहीं देख रहे हैं, तब तक आपको वास्तव में इस सामान के बारे में चिंता करने की आवश्यकता नहीं है। यदि आप कुछ उपयोगी पाने के लिए देख रहे हैं, तो आप बिल्कुल बंद हैं।
जेरेड स्मिथ

5
FYI करें "मुर्गी और मुर्गी की दुविधा" "मुर्गी और अंडे की समस्या" के लिए अंग्रेजी में सामान्य वाक्यांश है, जिसका नाम "मुर्गी या अंडा है?" (बेशक जवाब अंडा है। मुर्गियों से पहले अंडाकार जानवर लाखों साल तक थे।)
एरिक लिपपर्ट

जवाबों:


32

मैं जावास्क्रिप्ट के पर्दे के पर्दे के पीछे समझने की कोशिश कर रहा हूं और वस्तुओं में निर्मित, विशेष रूप से ऑब्जेक्ट और फंक्शन और उनके बीच के संबंध को समझने में अटक गया।

यह जटिल है, गलतफहमी करना आसान है, और एक बहुत से शुरुआती जावास्क्रिप्ट किताबें गलत हैं, इसलिए पढ़ी गई हर चीज पर भरोसा न करें।

मैं 1990 के दशक में Microsoft के JS इंजन के मानकीकरण और मानकीकरण समिति में से एक था, और मैंने इस उत्तर को डालने में कई गलतियाँ कीं। (हालांकि मैंने 15 साल से इस पर काम नहीं किया है लेकिन मुझे माफ किया जा सकता है।) यह मुश्किल भरा काम है। लेकिन एक बार जब आप प्रोटोटाइप इनहेरिटेंस को समझ लेते हैं, तो यह सब समझ में आता है।

जब मैंने पढ़ा कि Array, String इत्यादि में निर्मित सभी ऑब्जेक्ट ऑब्जेक्ट से एक्सटेंशन (इनहेरिट की गई) हैं तो मैंने मान लिया कि ऑब्जेक्ट ऑब्जेक्ट में पहला बनाया गया है जो कि निर्मित होता है और बाकी ऑब्जेक्ट इससे प्राप्त होता है।

कक्षा-आधारित विरासत के बारे में जो कुछ भी आप जानते हैं, उसे फेंककर शुरू करें। JS प्रोटोटाइप आधारित विरासत का उपयोग करता है।

इसके बाद, सुनिश्चित करें कि आपके सिर में बहुत स्पष्ट परिभाषा है कि "विरासत" का क्या अर्थ है। C # या Java या C ++ जैसी OO भाषाओं का उपयोग करने वाले लोग सोचते हैं कि इनहेरिटेंस का अर्थ सबटाइपिंग है, लेकिन इनहेरिटेंस का मतलब सबटिप करना नहीं है। वंशानुक्रम का अर्थ है कि एक चीज के सदस्य दूसरी चीज के सदस्य भी हैं । यह नहीं है जरूरी मतलब उन चीजों के बीच एक subtyping रिश्ता होता है कि! टाइप थ्योरी में बहुत सी गलतफहमियां लोगों को यह अहसास नहीं होने का नतीजा है कि इसमें अंतर है।

लेकिन इसका कोई मतलब नहीं है जब आपको पता चले कि ऑब्जेक्ट केवल फ़ंक्शन द्वारा बनाए जा सकते हैं, लेकिन फिर फ़ंक्शन भी कुछ नहीं बल्कि फ़ंक्शन की वस्तुएं हैं।

यह केवल झूठ है। कुछ फ़ंक्शन के लिए कॉल करके कुछ ऑब्जेक्ट नहीं बनाए जाते हैं । कुछ वस्तुओं को जेएस रनटाइम द्वारा बिल्कुल भी नहीं बनाया जाता है। ऐसे अंडे हैं जो किसी भी चिकन द्वारा नहीं रखे गए थे । वे सिर्फ रनटाइम द्वारा बनाए गए थे जब यह शुरू हुआ था।new FF

आइए बताते हैं कि नियम क्या हैं और शायद इससे मदद मिलेगी।

  • हर ऑब्जेक्ट इंस्टेंस में एक प्रोटोटाइप ऑब्जेक्ट होता है।
  • कुछ मामलों में जो प्रोटोटाइप हो सकते हैं null
  • यदि आप किसी ऑब्जेक्ट उदाहरण पर किसी सदस्य तक पहुँचते हैं, और ऑब्जेक्ट में वह सदस्य नहीं है, तो ऑब्जेक्ट उसके प्रोटोटाइप में ख़राब हो जाता है, या यदि प्रोटोटाइप शून्य है तो रुक जाता है।
  • prototypeएक वस्तु का सदस्य आमतौर पर है नहीं वस्तु के प्रोटोटाइप।
  • बल्कि, prototypeएक फंक्शन ऑब्जेक्ट F का सदस्य वह ऑब्जेक्ट है जो द्वारा बनाई गई ऑब्जेक्ट का प्रोटोटाइप बन जाएगा new F()
  • कुछ कार्यान्वयन में, उदाहरणों को एक __proto__सदस्य मिलता है जो वास्तव में अपना प्रोटोटाइप देता है। (यह अब हटा दिया गया है। इस पर भरोसा न करें।)
  • फंक्शन ऑब्जेक्ट्स को एक नई-नई डिफ़ॉल्ट ऑब्जेक्ट मिलती है, prototypeजब उन्हें बनाया जाता है।
  • एक फंक्शन ऑब्जेक्ट का प्रोटोटाइप निश्चित रूप से है Function.prototype

चलो योग करो।

  • का प्रोटोटाइप ObjectहैFunction.prototype
  • Object.prototype ऑब्जेक्ट प्रोटोटाइप ऑब्जेक्ट है।
  • का प्रोटोटाइप Object.prototypeहैnull
  • का प्रोटोटाइप Functionहै Function.prototype- यह उन दुर्लभ स्थितियों में से एक है जहां Function.prototypeवास्तव में प्रोटोटाइप है Function!
  • Function.prototype फ़ंक्शन प्रोटोटाइप ऑब्जेक्ट है।
  • का प्रोटोटाइप Function.prototypeहैObject.prototype

मान लीजिए कि हम एक फ़ंक्शन फू बनाते हैं।

  • का प्रोटोटाइप Fooहै Function.prototype
  • Foo.prototype फू प्रोटोटाइप वस्तु है।
  • का प्रोटोटाइप Foo.prototypeहै Object.prototype

मान लीजिए हम कहते हैं new Foo()

  • नई वस्तु का प्रोटोटाइप है Foo.prototype

सुनिश्चित करें कि समझ में आता है। चलो इसे ड्रा करें। अंडाकार वस्तु उदाहरण हैं। किनारे या तो __proto__अर्थ हैं "का प्रोटोटाइप", या prototypeअर्थ "की prototypeसंपत्ति"।

यहाँ छवि विवरण दर्ज करें

सभी रनटाइम को उन सभी ऑब्जेक्ट्स को बनाना होगा और तदनुसार अपने विभिन्न गुणों को असाइन करना होगा। मुझे यकीन है कि आप देख सकते हैं कि यह कैसे किया जाएगा।

अब आइए एक उदाहरण देखें जो आपके ज्ञान का परीक्षण करता है।

function Car(){ }
var honda = new Car();
print(honda instanceof Car);
print(honda.constructor == Car);

यह क्या छपता है?

खैर, क्या instanceofमतलब है? honda instanceof Carइसका मतलब है " प्रोटोटाइप श्रृंखला Car.prototypeपर किसी भी वस्तु के बराबर है honda?"

हाँ यही है। hondaप्रोटोटाइप है Car.prototype, तो हम कर रहे हैं। यह सच छापता है।

दूसरे के बारे में क्या?

honda.constructorमौजूद नहीं है इसलिए हम प्रोटोटाइप से सलाह लेते हैं, जो है Car.prototype। जब Car.prototypeऑब्जेक्ट बनाया गया था तो यह स्वचालित रूप से एक संपत्ति के constructorबराबर दिया गया था Car, इसलिए यह सच है।

अब इसका क्या?

var Animal = new Object();
function Reptile(){ }
Reptile.prototype = Animal;
var lizard = new Reptile();
print(lizard instanceof Reptile);
print(lizard.constructor == Reptile);

यह प्रोग्राम क्या छापता है?

फिर, lizard instanceof Reptileइसका मतलब है " प्रोटोटाइप श्रृंखला Reptile.prototypeपर किसी भी वस्तु के बराबर है lizard?"

हाँ यही है। lizardप्रोटोटाइप है Reptile.prototype, तो हम कर रहे हैं। यह सच छापता है।

अब, किस बारे में

print(lizard.constructor == Reptile);

आप सोच सकते हैं कि यह भी सच है, चूंकि lizardनिर्माण किया गया था , new Reptileलेकिन आप गलत होंगे। कारण बताइए।

  • क्या lizardकोई constructorसंपत्ति है? इसलिए हम प्रोटोटाइप को देखते हैं।
  • का प्रोटोटाइप lizardहै Reptile.prototype, जो है Animal
  • क्या Animalकोई constructorसंपत्ति है? नहीं, तो हम इसे प्रोटोटाइप के रूप में देखते हैं।
  • का प्रोटोटाइप Animalहै Object.prototype, और Object.prototype.constructorरनटाइम द्वारा बनाया गया है और इसके बराबर है Object
  • इसलिए यह गलत है।

हमें Reptile.prototype.constructor = Reptile;वहाँ किसी बिंदु पर कहना चाहिए था, लेकिन हमें याद नहीं था!

सुनिश्चित करें कि सभी आप के लिए समझ में आता है। यदि यह अभी भी भ्रमित है तो कुछ बक्से और तीर बनाएँ।

दूसरी बेहद भ्रमित करने वाली बात यह है, अगर मैं console.log(Function.prototype)किसी फ़ंक्शन को प्रिंट करता हूं, लेकिन जब मैं प्रिंट console.log(Object.prototype)करता हूं तो वह किसी ऑब्जेक्ट को प्रिंट करता है। Function.prototypeएक समारोह क्यों होता है जब इसे एक वस्तु माना जाता था?

फ़ंक्शन प्रोटोटाइप को एक फ़ंक्शन के रूप में परिभाषित किया जाता है, जिसे जब बुलाया जाता है, तो रिटर्न देता है undefined। हम पहले से ही जानते हैं कि Function.prototypeयह Functionप्रोटोटाइप है, अजीब तरह से पर्याप्त है। इसलिए इसलिए Function.prototype()कानूनी है, और जब आप इसे करते हैं, तो आप undefinedवापस आ जाते हैं। तो यह एक समारोह है।

Objectप्रोटोटाइप इस संपत्ति नहीं है, यह कॉल करने योग्य नहीं है। यह सिर्फ एक वस्तु है।

जब आप console.log(Function.prototype.constructor)इसे फिर से एक समारोह है।

Function.prototype.constructorबस Function, जाहिर है। और Functionएक फंक्शन है।

अब आप इसे स्वयं बनाने के लिए किसी चीज़ का उपयोग कैसे कर सकते हैं (माइंड = ब्लो)।

आप यह सोच रहे हैं । यह आवश्यक है कि रनटाइम वस्तुओं का एक गुच्छा बनाता है जब यह शुरू होता है। ऑब्जेक्ट्स केवल लुकअप टेबल हैं जो ऑब्जेक्ट्स के साथ तार जोड़ते हैं। जब क्रम शुरू होता है, यह सब करना है कुछ दर्जन खाली वस्तुओं को बनाने, और फिर बताए शुरू है prototype, __proto__, constructor, और इतने प्रत्येक वस्तु के गुणों पर जब तक वे ग्राफ है कि वे बनाने की जरूरत है सकते हैं।

यह उपयोगी होगा यदि आप उस आरेख को लेते हैं जो मैंने आपको ऊपर दिया था और constructorइसमें किनारों को जोड़ दिया था। आप जल्दी से देखेंगे कि यह एक बहुत ही सरल ऑब्जेक्ट ग्राफ है और रनटाइम को इसे बनाने में कोई समस्या नहीं होगी।

एक अच्छा व्यायाम इसे स्वयं करना होगा। यहाँ, मैं आपको शुरू करूँगा। हम my__proto__"के प्रोटोटाइप ऑब्जेक्ट" और myprototype"प्रोटोटाइप संपत्ति " का मतलब करने के लिए उपयोग करेंगे ।

var myobjectprototype = new Object();
var myfunctionprototype = new Object();
myfunctionprototype.my__proto__ = myobjectprototype;
var myobject = new Object();
myobject.myprototype = myobjectprototype;

और इसी तरह। क्या आप बाकी प्रोग्राम को ऑब्जेक्ट के एक सेट का निर्माण करने के लिए भर सकते हैं जिसमें "वास्तविक" जावास्क्रिप्ट में निर्मित वस्तुओं के समान टोपोलॉजी है? यदि आप ऐसा करते हैं, तो आप पाएंगे कि यह बेहद आसान है।

जावास्क्रिप्ट में वस्तुएँ सिर्फ लुकअप टेबल हैं जो अन्य वस्तुओं के साथ तार जोड़ती हैं । बस! यहां कोई जादू नहीं है। आप अपने आप को गाँठों में बंधे हुए पा रहे हैं क्योंकि आप उन बाधाओं की कल्पना कर रहे हैं जो वास्तव में मौजूद नहीं हैं, जैसे कि प्रत्येक वस्तु को एक निर्माता द्वारा निर्मित किया जाना था।

फ़ंक्शंस बस एक अतिरिक्त क्षमता वाले ऑब्जेक्ट हैं: जिन्हें बुलाया जाना है। इसलिए अपने छोटे सिमुलेशन कार्यक्रम के माध्यम से जाएं और .mycallableप्रत्येक वस्तु में एक संपत्ति जोड़ें जो इंगित करता है कि यह कॉल करने योग्य है या नहीं। यह इतना सरल है।


9
अंत में, एक संक्षिप्त, संक्षिप्त, जावास्क्रिप्ट की व्याख्या को समझने में आसान! अति उत्कृष्ट! हम में से कोई भी संभवतः कैसे भ्रमित हो सकता है? :) यद्यपि सभी गंभीरता में, वस्तुओं को देखने की मेज के बारे में अंतिम बिट वास्तव में महत्वपूर्ण है। पागलपन की एक विधि है --- लेकिन यह अभी भी पागलपन है ...
ग्रेग बरगार्ड

4
@GregBurghardt: मैं मानता हूँ कि यह पहली बार जटिल लगता है, लेकिन जटिलता सरल नियमों का परिणाम है। प्रत्येक वस्तु एक है __proto____proto__वस्तु प्रोटोटाइप के रिक्त है। __proto__की new X()है X.prototype। फंक्शन प्रोटोटाइप को __proto__छोड़कर सभी फ़ंक्शन ऑब्जेक्ट में फ़ंक्शन प्रोटोटाइप होता है। Objectऔर Functionफ़ंक्शन प्रोटोटाइप फ़ंक्शंस हैं। वे नियम सभी सीधे हैं, और वे प्रारंभिक वस्तुओं के ग्राफ की टोपोलॉजी का निर्धारण करते हैं।
एरिक लिपर्ट

6

आपके पास पहले से ही कई उत्कृष्ट उत्तर हैं, लेकिन मैं सिर्फ आपके उत्तर के बारे में एक संक्षिप्त और स्पष्ट उत्तर देना चाहता हूं कि यह सब कैसे काम करता है, और यह उत्तर है:

जादू!!!

वास्तव में, यह बात है।

ECMAScript निष्पादन इंजनों को लागू करने वाले लोगों को ECMAScript के नियमों को लागू करना होता है , लेकिन उनके कार्यान्वयन के भीतर उनका पालन नहीं होता है ।

ECMAScript स्पेसिफिकेशन कहता है कि A, B से विरासत में मिला है, लेकिन B, A का एक उदाहरण है? कोई दिक्कत नहीं है! के एक प्रोटोटाइप पॉइंटर के साथ पहले A बनाएँ NULL, B को A के उदाहरण के रूप में बनाएँ, फिर A को B से इंगित करने के लिए A के प्रोटोटाइप पॉइंटर को ठीक करें। बहुत आसान।

आप कहते हैं, लेकिन रुको, ECMAScript में प्रोटोटाइप पॉइंटर को बदलने का कोई तरीका नहीं है! लेकिन, यहां बात है: इस कोड को नहीं चल रहा है पर ECMAScript इंजन, इस कोड है ECMAScript इंजन। यह है वस्तुओं के आंतरिक भागों के लिए उपयोग इंजन पर ECMAScript कोड चल रहा है यह नहीं है कि है। संक्षेप में: यह जो चाहे कर सकता है।

वैसे, यदि आप वास्तव में चाहते हैं, तो आपको केवल एक बार ऐसा करना होगा: बाद में, आप उदाहरण के लिए अपनी आंतरिक मेमोरी को डंप कर सकते हैं और इस डंप को हर बार लोड कर सकते हैं जो आप अपने ईसीएमएस्क्रिप्ट इंजन को शुरू करते हैं।

ध्यान दें कि यह सब अभी भी लागू होता है, भले ही ECMAScript इंजन ECMAScript में लिखा गया हो (जैसा कि वास्तव में मोज़िला नार्सिसस के लिए मामला है, उदाहरण के लिए)। फिर भी, ECMAScript कोड जो इंजन को लागू करता है उसके पास अभी भी उस इंजन की पूरी पहुंच है जिसे वह कार्यान्वित कर रहा है , हालांकि निश्चित रूप से उस इंजन तक पहुंच नहीं है जिस पर वह चल रहा है


3

ECMA कल्पना से 1

ECMAScript में C ++, स्मॉलटाक, या जावा जैसे उचित वर्ग शामिल नहीं हैं, बल्कि, ऐसे कंस्ट्रक्टरों का समर्थन करते हैं जो कोड निष्पादित करके ऑब्जेक्ट बनाते हैं जो ऑब्जेक्ट्स के लिए स्टोरेज आवंटित करते हैं और उनके गुणों के लिए प्रारंभिक मान निर्दिष्ट करके सभी या उनमें से कुछ को इनिशियलाइज़ करते हैं। कंस्ट्रक्टर सहित सभी फ़ंक्शन ऑब्जेक्ट हैं, लेकिन सभी ऑब्जेक्ट्स कंस्ट्रक्टर नहीं हैं।

मैं यह नहीं देखता कि यह कैसे और अधिक स्पष्ट हो सकता है !!! </sarcasm>

आगे हम देखते हैं:

प्रोटोटाइप एक प्रोटोटाइप ईसीएमएस्क्रिप्ट में संरचना, स्थिति और व्यवहार विरासत को लागू करने के लिए उपयोग की जाने वाली वस्तु है। जब कोई कंस्ट्रक्टर एक ऑब्जेक्ट बनाता है, तो वह ऑब्जेक्ट स्पष्ट रूप से संपत्ति के संदर्भों को हल करने के उद्देश्य से कंस्ट्रक्टर के संबंधित प्रोटोटाइप का संदर्भ देता है। कंस्ट्रक्टर के संबंधित प्रोटोटाइप को प्रोग्राम एक्सप्रेशन constructor.prototype द्वारा संदर्भित किया जा सकता है, और किसी ऑब्जेक्ट के प्रोटोटाइप में जोड़े गए गुण, इनहेरिटेंस के माध्यम से, सभी ऑब्जेक्ट्स द्वारा प्रोटोटाइप को साझा करते हुए साझा किए जाते हैं।

इसलिए हम देख सकते हैं कि एक प्रोटोटाइप एक ऑब्जेक्ट है, लेकिन जरूरी नहीं कि एक फ़ंक्शन ऑब्जेक्ट हो।

इसके अलावा, हमारे पास यह दिलचस्प शीर्षक है

http://www.ecma-international.org/ecma-262/8.0/index.html#sec-object-objects

ऑब्जेक्ट कंस्ट्रक्टर% ऑब्जेक्ट% आंतरिक वस्तु और वैश्विक ऑब्जेक्ट की ऑब्जेक्ट संपत्ति का प्रारंभिक मूल्य है।

तथा

फ़ंक्शन निर्माता% फ़ंक्शन% आंतरिक वस्तु और वैश्विक ऑब्जेक्ट के फ़ंक्शन गुण का प्रारंभिक मान है।


अब यह करता है। ECMA6 आपको कक्षाओं को बनाने और उनसे वस्तुओं को तुरंत निकालने की अनुमति देता है।
ncmathsadist

2
@ncmathsadist ES6 कक्षाएं केवल एक वाक्य रचना चीनी हैं, शब्दार्थ समान हैं।
हमजा फातमी

1
आपका sarcasmमॉनीकर अन्यथा, यह पाठ वास्तव में एक शुरुआत के लिए काफी अपारदर्शी है।
रॉबर्ट हार्वे

सच, बीमार बाद में और जोड़ते हैं, कुछ खुदाई करने की जरूरत है
इवान

1
ईआरएम? यह इंगित करने के लिए कि यह डॉक से स्पष्ट नहीं है
इवान

1

निम्नलिखित प्रकार जावास्क्रिप्ट में हर मूल्य शामिल हैं:

  • boolean
  • number
  • undefined(जिसमें एकल मूल्य शामिल है undefined)
  • string
  • symbol (सार अद्वितीय "चीजें" जो संदर्भ से तुलना की जाती हैं)
  • object

जावास्क्रिप्ट में हर वस्तु (यानी सब कुछ) का एक प्रोटोटाइप है, जो एक प्रकार की वस्तु है।

प्रोटोटाइप में फ़ंक्शंस होते हैं, जो एक प्रकार की वस्तु 1 भी हैं

ऑब्जेक्ट में एक कंस्ट्रक्टर भी होता है, जो एक फ़ंक्शन होता है, और इसलिए एक प्रकार का ऑब्जेक्ट।

नेस्टेड

यह सभी पुनरावर्ती है, लेकिन कार्यान्वयन इसे स्वचालित रूप से करने में सक्षम है, क्योंकि जावास्क्रिप्ट कोड के विपरीत, यह जावास्क्रिप्ट कार्यों को कॉल किए बिना ऑब्जेक्ट बना सकता है (क्योंकि ऑब्जेक्ट केवल मेमोरी हैं जो कार्यान्वयन नियंत्रण करते हैं)।

कई गतिशील रूप से टाइप की गई भाषाओं में अधिकांश ऑब्जेक्ट सिस्टम इस तरह से परिपत्र 2 हैं। उदाहरण के लिए, पायथन में, कक्षाएं ऑब्जेक्ट हैं, और कक्षाओं का वर्ग है type, इसलिए typeयह स्वयं का एक उदाहरण है।

सबसे अच्छा विचार सिर्फ उन उपकरणों का उपयोग करना है जो भाषा प्रदान करती है, और इसके बारे में बहुत अधिक नहीं सोचते कि वे वहां कैसे पहुंचे।

1 कार्य विशेष हैं, क्योंकि वे कॉल करने योग्य हैं, और वे एकमात्र मूल्य हैं जिनमें अपारदर्शी डेटा (उनके शरीर और संभवतः एक बंद) हो सकता है।

2 यह वास्तव में एक यातना से अधिक है, जो अपने आप में पीछे की ओर झुकी हुई है, लेकिन "गोलाकार" काफी करीब है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.