__Proto__ कंस्ट्रक्टर से कैसे अलग है।


163
function Gadget(name, color)
{
   this.name = name;
   this.color = color;
}

Gadget.prototype.rating = 3

var newtoy = new Gadget("webcam", "black")

newtoy.constructor.prototype.constructor.prototype.constructor.prototype 

यह हमेशा ऑब्जेक्ट को रेटिंग = 3 के साथ लौटाता है।

लेकिन अगर मैं निम्नलिखित कार्य करता हूं:

newtoy.__proto__.__proto__.__proto__

वापस लौटने पर श्रृंखला समाप्त होती है null

इंटरनेट एक्सप्लोरर में भी अगर __proto__संपत्ति नहीं है तो मैं नल की जांच कैसे करूंगा ?


30
यह ग्राफ आरेख आपको प्रोटोटाइप और प्रोटो के बीच के अंतर को समझने में मदद करेगा । आप newtoy ऑब्जेक्ट से प्रोटो चेन का अनुसरण कर सकते हैं , और तब आपको पता चलेगा कि newtoy से तीसरा प्रोटो क्यों शून्य है।
बिट्स

इसके अलावा आरेख से स्पष्ट है जो इसके newtoy.prototypeबराबर नहीं है newtoy.constructor.prototypeऔर इसलिए newtoy.constructor.prototypeइसके पास संपत्ति नहीं होगी rating। इसी तरह newtoy.constructor.prototype.constructor.propertyसंपत्ति भी नहीं होगी rating
बिट्स

अंतिम टिप्पणी में टाइपो: इसलिए newtoy.constructor.prototypeरेटिंग नामक संपत्ति होगी। इसी तरह newtoy.constructor.prototype.constructor.propertyसंपत्ति भी होगी जिसे रेटिंग कहा जाता है।
बिट्स


1
@Royi Namir मैंने gsub पर jsViz अपलोड किया है । यहाँ डेमो साइट है । कृपया ध्यान न रखें कि वास्तविक कोड कैसे (और गंदा) है। इसका सुपर पुराना प्रोजेक्ट जिसे मैंने हमेशा के लिए नहीं छुआ।
बिट्स

जवाबों:


210

मैं हाल ही में अपने सिर को चारों ओर लपेटने की कोशिश कर रहा हूं और अंत में इस "मानचित्र" के साथ आया हूं कि मुझे लगता है कि इस मामले पर पूरी तरह से प्रकाश डाला गया है

http://i.stack.imgur.com/KFzI3.png यहां छवि विवरण दर्ज करें

मुझे पता है कि मैं इसे बनाने वाला पहला व्यक्ति नहीं हूं, लेकिन यह पता लगाना अधिक दिलचस्प था कि इसे ढूंढना :-)। फिर भी, उसके बाद मैंने पाया कि यह एक और चित्र है जो मुझे लगता है कि मूल रूप से समान है:

जावास्क्रिप्ट ऑब्जेक्ट लेआउट

मेरे लिए सबसे आश्चर्यजनक बात यह थी कि इसके बजाय, उस Object.__proto__बिंदु की खोज की जा रही थी , लेकिन मुझे यकीन है कि इसके लिए एक अच्छा कारण है :-)Function.prototypeObject.prototype

मैं छवि में उल्लिखित कोड को यहां भी पेस्ट करता हूं जैसे कि कोई भी इसका परीक्षण करना चाहता है। ध्यान दें कि कुछ गुणों को वस्तुओं में जोड़ा जाता है ताकि यह जानना आसान हो सके कि हम कुछ जम्प के बाद कहाँ हैं:

Object.O1='';
Object.prototype.Op1='';

Function.F1 = '';
Function.prototype.Fp1 = '';

Cat = function(){};
Cat.C1 = '';
Cat.prototype.Cp1 = '';

mycat = new Cat();
o = {};

// EDITED: using console.dir now instead of console.log
console.dir(mycat);
console.dir(o);

2
@utsaina बहुत अच्छा है। उस कोड का एक और चित्रमय प्रतिनिधित्व चेकआउट करें जिसे ओपी ने पोस्ट किया है। और मुझे लगता है कि हमारे विवरण तकनीकी विवरणों के अनुसार हैं।
बिट्स

43
जिस कारण से Object.__proto__इंगित किया Function.prototypeजाता है वह कारण है Object()कि अपने आप में एक मूल कार्य है जो एक खाली वस्तु को तत्काल कर देता है। इसलिए, Object()एक फ़ंक्शन है। आप पाएंगे कि अन्य सभी प्रमुख देशी प्रकार के __proto__गुण इंगित करते हैं Function.prototypeObject, Function, String, Number, और Arrayसभी समारोह प्रोटोटाइप प्राप्त करती हैं।
कुंडा

@drodsou आपका दूसरा लिंक बहुत बढ़िया है। अब इसे बाहर की जाँच करें कृपया;) mollypages.org/misc/js.mp अच्छा विवरण: D
abhisekp

@Swivel "इसलिए, ऑब्जेक्ट () एक फ़ंक्शन है" - क्या आपके कहने का मतलब ऑब्जेक्ट एक फ़ंक्शन है? without ()
जियोर्जिम

2
@GiorgiMoniava सही। Objectअपने आप में एक समारोह है; कॉल करने योग्य Object(यानी, वापसी के चलने का मूल्य Object()) निष्पादित करने का परिणाम एक फ़ंक्शन नहीं है।
कुंडा 19

67

constructor एक पूर्व-परिभाषित [[डॉन्टाइनम]] द्वारा इंगित की गई वस्तु की संपत्ति है prototype संपत्ति एक फ़ंक्शन ऑब्जेक्ट संपत्ति और शुरू में फ़ंक्शन ऑब्जेक्ट को ही इंगित करेगी।

__proto__ आंतरिक [[प्रोटोटाइप]] किसी वस्तु की संपत्ति के बराबर है, अर्थात इसका वास्तविक प्रोटोटाइप।

जब आप newऑपरेटर के साथ कोई ऑब्जेक्ट बनाते हैं , तो उसकी आंतरिक [[प्रोटोटाइप]] संपत्ति को निर्माता के फ़ंक्शन द्वारा बताई गई ऑब्जेक्ट पर सेट किया जाएगा prototype

इसका अर्थ है कि वस्तु का निर्माण करने के लिए उपयोग किए जाने वाले अर्थात निर्माणकर्ता फ़ंक्शन का .constructorमूल्यांकन करेगा .__proto__.constructor, और जैसा कि हमने सीखा है, protoypeइस फ़ंक्शन की संपत्ति का उपयोग ऑब्जेक्ट के [[प्रोटोटाइप]] सेट करने के लिए किया गया था।

यह निम्न के .constructor.prototype.constructorसमान है .constructor(जब तक कि इन गुणों को अधिलेखित नहीं किया गया है); अधिक विस्तृत विवरण के लिए यहां देखें ।

यदि __proto__उपलब्ध है, तो आप ऑब्जेक्ट की वास्तविक प्रोटोटाइप श्रृंखला चला सकते हैं। सादे ECMAScript3 में ऐसा करने का कोई तरीका नहीं है क्योंकि जावास्क्रिप्ट को गहरी विरासत वंशानुक्रम के लिए डिज़ाइन नहीं किया गया था।


3
वह 'यहाँ' लिंक सोने का मानक है। यदि आप पूर्ण विवरण चाहते हैं तो वहां जाएं।
रियालसिन

.constructor.prototypeचैनिंग के साथ अच्छा कैच । मैं भी मेरे लिए अस्पष्ट था, जबकि मैंने नहीं देखा कि .constructorवह बराबर है .__proto__.constructor। जिसका सीधा सा मतलब है कि कंस्ट्रक्टर फ़ंक्शन के बीच साइकिल चलाना और यह प्रोटोटाइप है।
जॉनी_ड

30

जावास्क्रिप्ट में प्रोटोटाइप इनहेरिटेंस इस __proto__अर्थ में संपत्ति पर आधारित है कि प्रत्येक वस्तु को उसके द्वारा संदर्भित वस्तु की सामग्री विरासत में मिली है__proto__ संपत्ति ।

prototypeसंपत्ति के लिए ही खास है Functionवस्तुओं और केवल का उपयोग करते समय newऑपरेटर एक कॉल करने के लिए Functionनिर्माता के रूप में। इस मामले में, निर्मित वस्तु __proto__को निर्माता के पास सेट किया जाएगा Function.prototype

इसका मतलब यह है कि जोड़ने के लिए Function.prototypeस्वचालित रूप से उन सभी वस्तुओं को प्रतिबिंबित करेगा, __proto__जो संदर्भित कर रहा है Function.prototype

Function.prototypeकिसी अन्य ऑब्जेक्ट के साथ निर्माता को प्रतिस्थापित करना किसी भी पहले से मौजूद ऑब्जेक्ट के लिए संपत्ति को अपडेट नहीं करेगा __proto__

ध्यान दें कि __proto__प्रॉपर्टी को सीधे एक्सेस नहीं किया जाना चाहिए, इसके बजाय Object.getPrototypOf (ऑब्जेक्ट) का उपयोग किया जाना चाहिए।

पहले प्रश्न का उत्तर देने के लिए, मैंने __proto__और prototypeसंदर्भों का एक द्विआधारी आरेख बनाया है , दुर्भाग्य से स्टैकओवरफ़्लो मुझे "10 से कम प्रतिष्ठा" के साथ छवि को जोड़ने की अनुमति नहीं देता है। शायद किसी और समय।

[संपादित करें] आंकड़ा [[Prototype]]इसके बजाय उपयोग करता है __proto__क्योंकि इसी तरह ECMAScript विनिर्देश आंतरिक वस्तुओं को संदर्भित करता है। मुझे आशा है कि आप सब कुछ समझ सकते हैं।

यह आंकड़ा समझने में आपकी मदद करने के लिए कुछ संकेत हैं:

red    = JavaScript Function constructor and its prototype
violet = JavaScript Object constructor and its prototype
green  = user-created objects
         (first created using Object constructor or object literal {},
          second using user-defined constructor function)
blue   = user-defined function and its prototype
         (when you create a function, two objects are created in memory:
          the function and its prototype)

ध्यान दें कि constructorबनाई गई वस्तुओं में संपत्ति मौजूद नहीं है, लेकिन प्रोटोटाइप से विरासत में मिली है।

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


@xorcus आप इस के बारे में समझाएं सकता है: new MyFunction()एक वस्तु उदाहरण है जो अपनी बनाता है __proto__इसकी ctor प्रोटोटाइप जो है का संदर्भ लेना चाहिए MyFunction.prototype.तो क्यों करता है MyFunction.prototype.__proto__करने के लिए referes Object.prototype? यह जो है इसकी ctor के प्रोटोटाइप के लिए (मेरा पहला नमूना की तरह) referene चाहिए MyFunction.prototype(सूचना है कि MyFunction.prototypeका एक instnace है Myfunction)
Royi Namir

@Royi Namir: MyFunction.prototype .__ proto__ का संदर्भ ऑब्जेक्ट.प्रोटोटाइप से है क्योंकि MyFunction.prototype एक ऑब्जेक्ट है। Object.prototype को सभी ऑब्जेक्ट्स द्वारा विरासत में मिला है (सामान्य रूप से, यही वह जगह है जहाँ विरासत की प्रोटोटाइप श्रृंखला समाप्त होती है)। मैं इस बात से सहमत नहीं हूं कि MyFunction.prototype MyFunction का एक उदाहरण है। obj instof MyFunction MyFunction.prototype ऑब्जेक्ट के लिए ऐसा नहीं है
xorcus

14

Objectईव है, और Functionएडम है, एडम ( Function) Function.prototypeईव ( Object) बनाने के लिए अपनी हड्डी ( ) का उपयोग करता है । फिर आदम को किसने बनाया (Function ) को ? - जावास्क्रिप्ट भाषा का आविष्कारक :-)।

Utsaina के उत्तर के अनुसार, मैं अधिक उपयोगी जानकारी जोड़ना चाहता हूं।

मेरे लिए सबसे आश्चर्यजनक बात यह थी कि इसके बजाय, उस Object.__proto__ बिंदु की खोज की जा रही थी , लेकिन मुझे यकीन है कि इसके लिए एक अच्छा कारण है :-)Function.prototypeObject.prototype

यह नहीं होना चाहिए। Object.__proto__को इंगित नहीं करना चाहिए Object.prototype। इसके बजाय, उदाहरण Object o, o.__proto__को इंगित करना चाहिएObject.prototype

(शर्तों का उपयोग करने के लिए मुझे क्षमा करें classऔरinstance जावास्क्रिप्ट , लेकिन आप इसे जानते हैं :-)

मुझे लगता है कि वर्ग Objectही इसका एक उदाहरण है Function, इसीलिए Object.__proto__ === Function.prototype। इसलिए: Objectईव है, और Functionएडम है, एडम ( Function) Function.prototypeईव बनाने के लिए अपनी हड्डी ( ) का उपयोग करता है (Object )।

इसके अलावा, यहां तक ​​कि वर्ग Functionखुद का एक उदाहरण Functionहै Function.__proto__ === Function.prototype, यही कारण है कि यह भी हैFunction === Function.constructor

इसके अलावा, नियमित वर्ग Catइसका उदाहरण Functionहै Cat.__proto__ === Function.prototype

उपरोक्त का कारण है, जब हम जावास्क्रिप्ट में एक वर्ग बनाते हैं, वास्तव में, हम केवल एक फ़ंक्शन बना रहे हैं, जिसका एक उदाहरण होना चाहिए FunctionObjectऔर Functionसिर्फ विशेष हैं, लेकिन वे अभी भी कक्षाएं हैं, जबकि Catएक नियमित वर्ग है।

कारक के रूप में, Google Chrome जावास्क्रिप्ट इंजन में, निम्नलिखित 4:

  • Function.prototype
  • Function.__proto__
  • Object.__proto__
  • Cat.__proto__

वे ===अन्य 3 के लिए सभी (बिल्कुल बराबर) हैं, और उनका मूल्य हैfunction Empty() {}

> Function.prototype
  function Empty() {}
> Function.__proto__
  function Empty() {}
> Object.__proto__
  function Empty() {}
> Cat.__proto__
  function Empty() {}
> Function.prototype === Function.__proto__
  true
> Function.__proto__ === Object.__proto__
  true
> Object.__proto__ === Cat.__proto__
  true

ठीक है। फिर विशेष function Empty() {}( Function.prototype) का निर्माण कौन करता है ? इसके बारे में सोचो :-)


इससे सहमत function Empty() {}हूं कि, आखिरी एक चीज को छोड़कर: आप फंक्शन.प्रोटोटाइप, आदि के बराबर होने का उल्लेख क्या कर रहे हैं ?, क्रोम कंसोल में आपके द्वारा उपयोग किया गया कोड क्या है?
drodsou

2
मैंने आपके द्वारा इंगित की गई अंतिम एक चीज़ को ठीक किया उनका मूल्य function Empty() {}Google Chrome में है। मैंने कंसोल आउटपुट भी जोड़ा।
पीटर ली

सभी फ़ंक्शन Instof फ़ंक्शन हैं, और इसलिए, _ _proto_ _Function.prototype से सभी फ़ंक्शन इनहेरिट ( ) होते हैं। यह उतना ही सरल है :)
xorcus

पुराने धागे पर टिप्पणी करने के लिए क्षमा करें। लेकिन क्या वे भाषा के आविष्कारक द्वारा बनाए गए हैं?
पटेल पार्थ

6

मैं वास्तव में नहीं जानता कि लोगों ने आपको इस बारे में सही क्यों नहीं किया कि आपकी समझ में वास्तविक समस्या कहाँ है।

इससे आपको समस्या का समाधान करने में बहुत आसानी होगी

तो चलिए देखते हैं क्या चल रहा है:

var newtoy = new Gadget("webcam", "black")

newtoy 
  .constructor //newtoy's constructor function is newtoy ( the function itself)
    .prototype // the function has a prototype property.( all functions has)
      .constructor // constructor here is a **property** (why ? becuase you just did `prototype.constructor`... see the dot ? )  ! it is not(!) the constructor function  !!! this is where your mess begins. it points back to the constructor function itself ( newtoy function)
         .prototype // so again we are at line 3 of this code snippet
            .constructor //same as line 4 ...
                .prototype 
                 rating = 3

महान, तो अब इस पर नजर डालते हैं __proto__

इससे पहले, कृपया 2 बातें याद रखें __proto__ :

  1. जब आप newऑपरेटर के साथ एक ऑब्जेक्ट बनाते हैं , तो इसकी आंतरिक [[Prototype]]/ proto__संपत्ति यदि आप चाहें तो prototypeइसके constructor functionया "निर्माता" की संपत्ति (1) पर सेट हो जाएगी ।

  2. JS के भीतर हार्ड कोडित -: Object.prototype.__proto__है null

आइए देखें इन 2 बिंदुओं को " bill"

newtoy
     .__proto__ // When `newtoy` was created , Js put __proto__'s value equal to the value of the cunstructor's prototype value. which is `Gadget.prototype`.
       .__proto__ // Ok so now our starting point is `Gadget.prototype`. so  regarding "bill" who is the constructor function now? watch out !! it's a simple object ! a regular object ! prototype is a regular object!! so who is the constructor function of that object ? Right , it's the `function Object(){...}`.  Ok .( continuing "bill" ) does it has a `prototype` property ? sure. all function has. it's `Object.prototype`. just remember that when Gadget.prototype was created , it's internal `__proto__` was refered to `Object.prototype` becuase as "bill" says :"..will be set to the `prototype` property of   its `constructor function`"
          .__proto__ // Ok so now our satrting point is `Object.prototype`. STOP. read bullet 2.Object.prototype.__proto__ is null by definition. when Object.prototype ( as an object) was created , they SET THE __PROTO__ AS NULL HARDCODED

बेहतर?


2

प्रत्येक फ़ंक्शन इसे प्रोटोटाइप बनाता है। और जब हम उस फ़ंक्शन कंस्ट्रक्टर का उपयोग करके एक ऑब्जेक्ट बनाते हैं तो मेरी ऑब्जेक्ट की __proto__ संपत्ति उस फ़ंक्शन के प्रोटोटाइप की ओर इशारा करना शुरू कर देगी।


1
मुझे लगता है कि आपको __proto__संपत्ति कहने का मतलब है ।
विमुद्रीकरण

हाँ। मेरा मतलब किसी वस्तु की प्रोटो प्रॉपर्टी से था । मुझे आशा है कि जानकारी उपयोगी थी।
अपूर्व नाग

2

यदि वे सभी आंकड़े भारी थे, तो आइए एक नज़र डालते हैं कि गुणों का क्या मतलब है।

STH.prototype

एक नया फ़ंक्शन बनाते समय, समानांतर में बनाई जा रही एक खाली वस्तु होती है और [[Prototype]]चेन के साथ फ़ंक्शन से जुड़ी होती है। इस ऑब्जेक्ट तक पहुंचने के लिए, हम prototypeफ़ंक्शन की संपत्ति का उपयोग करते हैं।

function Gadget() {}
// in background, new object has been created
// we can access it with Gadget.prototype
// it looks somewhat like {constructor: Gadget}

ध्यान में रखना है कि prototype संपत्ति केवल कार्यों के लिए उपलब्ध है।

STH.constructor

ऊपर उल्लिखित प्रोटोटाइप ऑब्जेक्ट में एक के अलावा कोई गुण नहीं है - constructor। यह गुण एक फ़ंक्शन का प्रतिनिधित्व करता है जिसने प्रोटोटाइप ऑब्जेक्ट बनाया।

var toy = new Gadget();

Gadgetफ़ंक्शन बनाते समय , हमने एक ऑब्जेक्ट बनाया जैसे {constructor: Gadget}- वह कुछ भी नहीं है Gadget.prototype। जैसा constructorकि एक फ़ंक्शन को संदर्भित करता है जिसने ऑब्जेक्ट प्रोटोटाइप बनाया, toy.constructorप्रतिनिधित्व करता हैGadget फ़ंक्शन का करता है। हम लिखते हैं toy.constructor.prototypeऔर हम {constructor: Gadget}फिर से मिल रहे हैं ।

इसलिए, एक दुष्चक्र है: आप उपयोग कर सकते हैं toy.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor.prototypeऔर यह हमेशा रहेगा Gadget.prototype

toy
.constructor    // Gadget
.prototype    // {constructor: Gadget}
.constructor    // Gadget
.prototype    // {constructor: Gadget}
// ...

STH .__ proto__

जबकि prototypeकार्यों के लिए एक विशिष्ट संपत्ति है, __proto__सभी वस्तुओं के लिए उपलब्ध है क्योंकि यह अंदर रहती है Object.prototype। यह एक फ़ंक्शन के प्रोटोटाइप को संदर्भित करता है जो एक ऑब्जेक्ट बना सकता है।

[].__proto__ === Array.prototype
// true

({}).__proto === Object.prototype
// true

यहाँ, toy.__proto__है Gadget.prototype। जैसा Gadget.prototypeकि एक ऑब्जेक्ट है ( {}) और ऑब्जेक्ट Objectफ़ंक्शन के साथ बनाए गए हैं (ऊपर उदाहरण देखें), हम प्राप्त करते हैं Object.prototype। यह जावास्क्रिप्ट में उच्च वस्तु है और __proto__यह केवल संकेत कर सकता है null

toy
.__proto__    // Gadget.prototype (object looking like {constructor: Gadget})
.__proto__    // Object.prototype (topmost object in JS)
.__proto__    // null - Object.prototype is the end of any chain

0

संक्षिप्त उत्तर: __proto__का संदर्भ हैprototype निर्माणकर्ता संपत्ति का जिसने ऑब्जेक्ट बनाया है।

जावास्क्रिप्ट में वस्तुएँ

जावास्क्रिप्ट ऑब्जेक्ट एक अंतर्निहित प्रकार है जो शून्य या अधिक गुणों के संग्रह के लिए है । गुण कंटेनर हैं जो अन्य वस्तुओं, आदिम मूल्यों या कार्यों को पकड़ते हैं।

जावास्क्रिप्ट में निर्माता

कार्यात्मक वस्तुएं हैं (जो [[Call]]ECMA-262 शब्दों में लागू होती हैं) कॉल करने योग्य होने की अतिरिक्त क्षमता के साथ लेकिन जावास्क्रिप्ट में एक और भूमिका निभाती हैं: यदि वे इसके माध्यम से बुलाए जाते हैं तो वे निर्माता ( वस्तुओं के लिए कारखाने ) बन जाते हैं ।new ऑपरेटर के । कन्स्ट्रक्टर्स इस प्रकार अन्य भाषाओं में कक्षाओं के लिए एक मोटे अनुरूप हैं।

प्रत्येक जावास्क्रिप्ट फ़ंक्शन वास्तव में Functionअंतर्निहित फ़ंक्शन ऑब्जेक्ट का एक उदाहरण है, जिसमें prototypeप्रोटोटाइप-आधारित विरासत और साझा गुणों को लागू करने के लिए उपयोग की जाने वाली एक विशेष संपत्ति है । कंस्ट्रक्टर फ़ंक्शन द्वारा बनाई गई प्रत्येक ऑब्जेक्ट में इसके निर्माता के मूल्य का एक अंतर्निहित संदर्भ (प्रोटोटाइप कहा जाता है __proto__) है prototype

कंस्ट्रक्टर ऑब्जेक्ट बनाने के लिए prototypeएक प्रकार का ब्लूप्रिंट है क्योंकि कंस्ट्रक्टर द्वारा बनाई गई प्रत्येक वस्तु को उसके संदर्भ में विरासत मिलती है prototype

प्रोटोटाइप श्रृंखला

एक वस्तु आंतरिक संपत्ति [[Prototype]]या के माध्यम से अपने प्रोटोटाइप को निर्दिष्ट करती है __proto__। दो वस्तुओं के बीच प्रोटोटाइप संबंध वंशानुक्रम के बारे में है: प्रत्येक वस्तु के प्रोटोटाइप के रूप में एक और वस्तु हो सकती है। प्रोटोटाइप का nullमान हो सकता है ।

__proto__संपत्ति से जुड़ी वस्तुओं की श्रृंखला को प्रोटोटाइप श्रृंखला कहा जाता है । जब किसी ऑब्जेक्ट में किसी ऑब्जेक्ट के लिए एक संदर्भ बनाया जाता है, तो वह संदर्भ प्रोटोटाइप चेन में पहले ऑब्जेक्ट में मिली संपत्ति का होता है जिसमें उस नाम की एक संपत्ति होती है। प्रोटोटाइप श्रृंखला ऐसा व्यवहार करती है जैसे कि वह एक ही वस्तु हो।

यह चित्र देखें (इस ब्लॉग से निकाला गया ):

proto.jpg

जब भी आप किसी ऑब्जेक्ट में किसी संपत्ति तक पहुंचने का प्रयास करते हैं, तो जावास्क्रिप्ट उस ऑब्जेक्ट में इसके लिए खोज शुरू करता है और अपने प्रोटोटाइप, प्रोटोटाइप के प्रोटोटाइप और इसी तरह जारी रहता है जब तक कि संपत्ति का सामना नहीं किया जाता है या यदि __proto__मूल्य रखता है null

प्रोटोटाइप श्रृंखला का उपयोग करते हुए इस प्रकार की विरासत को अक्सर कक्षा श्रृंखला का उपयोग करके अन्य भाषाओं के साथ भ्रम से बचने के लिए प्रतिनिधिमंडल कहा जाता है ।

लगभग सभी वस्तुओं के उदाहरण हैं Object, क्योंकि Object.prototypeउनकी प्रोटोटाइप श्रृंखला में अंतिम है। लेकिन Object.prototypeएक उदाहरण नहीं है Objectक्योंकि Object.prototype.__proto__मूल्य रखता है null

आप nullइस तरह एक प्रोटोटाइप के साथ एक वस्तु भी बना सकते हैं :

var dict = Object.create(null);

ऐसी वस्तु शाब्दिक वस्तु की तुलना में एक बेहतर मानचित्र (शब्दकोश) है, यही वजह है कि इस पैटर्न को कभी-कभी तानाशाही पैटर्न ( तानाशाही) कहा जाता है लिए ) ।

नोट: उपयोग की गई शाब्दिक वस्तुएं {}उदाहरण हैं, Objectक्योंकि ({}).__proto__यह एक संदर्भ है Object.prototype


कृपया आपके द्वारा उपयोग किए जा रहे उद्धरण और कलाकृतियों के स्रोत का हवाला दें। चित्र giamir.com/pseudoclasses-and-prototypal-inheritance-in-JS से आता है , क्या आपके पास इस पर कॉपीराइट है?
बरगी

@ बर्गी मैंने छवि के स्रोत का हवाला दिया। मेरे द्वारा उपयोग किए जाने वाले अधिकांश उद्धरण या तो JS मानक या MDN से निकाले गए हैं
eigenslacker
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.