दिलचस्प पोस्ट
एसक्यूएल सर्वर में स्ट्रिंग्स को जोड़ने के लिए ग्रुप का उपयोग कैसे करें? Sass के साथ अंत में अभिभावक चयनकर्ता को जोड़ना क्या Google क्रोम में कोई "फ़ॉन्ट चौरसाई" है? पायथन पंडों में मौजूदा डेटाफ्रेम में नया कॉलम जोड़ना एक संपादन टेक्स्ट के भीतर एक ड्रॉएबल पर क्लिक ईवेंट को संभालना एंड्रॉइड एमुलेटर में Google Play सेवाएं डाउनलोड करने के लिए कैसे? मूल्य की चौड़ाई के लिए ऑटो-स्केलिंग इनपुट ? आंतरिक टेक्स्ट द्वारा तत्व कैसे प्राप्त करें Java में प्रकार सूची प्रकार ArrayList Regexes में एक शब्द सीमा क्या है? PHP: अपवाद बनाम त्रुटियाँ? बहुत कम आकार के बाद छवि की गुणवत्ता – जावा अजगर – क्या प्रत्येक शब्द की आवृत्ति को खोजने के लिए एक शब्दकोश धीमा है? एचटीएमएल स्ट्रिंग्स को पढ़ना / आउटपुट करना "हर बोली से पहले स्लैश" समस्या

__प्रोटो__ कन्स्ट्रक्टर से कैसे भिन्न होता है। प्रोटोपीप?

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__ प्रॉपर्टी नहीं है, तो मैं कैसे नल की जांच __proto__ ?

वेब के समाधान से एकत्रित समाधान "__प्रोटो__ कन्स्ट्रक्टर से कैसे भिन्न होता है। प्रोटोपीप?"

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

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

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

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

मेरे लिए सबसे आश्चर्यजनक बात यह Object.__proto__ थी कि Object.__proto__ इंगित Function.prototype , Object.__proto__ बजाय। Object.prototype , लेकिन मुझे यकीन है कि इसके लिए एक अच्छा कारण है 🙂

मैं इस कोड में वर्णित कोड को पेस्ट कर रहा हूँ यहां तक ​​कि अगर कोई इसे जांचना चाहता है I ध्यान दें कि कुछ गुण ऑब्जेक्ट्स को जोड़ते हैं ताकि यह जानना आसान हो जाए कि हम कुछ कूद के बाद कहां हैं:

 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); 

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

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

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

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

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

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

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

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

इसका अर्थ है कि __proto__ को __proto__ उन सभी वस्तुओं पर स्वचालित रूप से प्रदर्शित होगा, जिनके __proto__ को संदर्भित कर रहा है।

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

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

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

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

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

 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 वस्तुएं निर्मित वस्तुओं में मौजूद नहीं हैं, लेकिन प्रोटोटाइप से विरासत में मिली हैं।

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

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

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

मेरे लिए सबसे आश्चर्यजनक बात यह Object.__proto__ थी कि Object.__proto__ इंगित Function.prototype , Object.__proto__ बजाय। Object.prototype , लेकिन मुझे यकीन है कि इसके लिए एक अच्छा कारण है 🙂

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

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

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

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

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

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

कारक की बात के रूप में, Google क्रोम जावास्क्रिप्ट इंजन में, निम्न 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 )? इसके बारे में सोचो 🙂

मुझे सच में नहीं पता है कि लोगों ने आपकी समझ में क्या वास्तविक समस्या कहां से सही नहीं की।

यह आपके लिए समस्या को हल करने के लिए बहुत आसान बना देगा

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

 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__

इससे पहले, कृपया __proto__ विषय में 2 चीजों को याद रखें:

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

  2. जेएस के भीतर हार्ड कोडित: – 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 

बेहतर?

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