2013-11-28 5 views
8

पर विचार निम्नलिखित:"प्रोटोटाइप" के विपरीत क्या है?

var o = {foo: 'bar'}; 
var p = Object.create(o); 

तो oप्रोटोटाइप p की है, तो o के संबंध में p क्या है?

+2

@ युआन मैं शुरुआत में उस शब्द के लिए पहुंचा, लेकिन प्रोटोटाइप * "कन्स्ट्रक्टर" नहीं है। यही है, 'उदाहरण के लिए' टाइप टाइपर फेंकता है। वास्तव में – user2864740

+1

। 'p exampleof o' एक 'TypeError' है। – Amadan

+0

@ अहमदन लेकिन यह कोई भी कारण नहीं बनाता है। यह व्यावहारिक रूप से क्या मतलब है, है ना? – user3025492

उत्तर

5

मुझे पता नहीं है कि ऑब्जेक्ट के औपचारिक शब्द पर कोई व्यापक सहमति है जिसका प्रोटोटाइप एक अन्य वस्तु है, लेकिन आईएमएचओ शब्द व्युत्पन्न वस्तु स्वीकार्य है।

प्रोटोटाइप विरासत का बिंदु यह है कि एक वस्तु किसी अन्य से प्राप्त होती है, या किसी अन्य से प्राप्त होती है। कुछ शास्त्रीय ओओ भाषाओं में, जैसे कि सी ++, आप व्युत्पन्न कक्षा शब्द सुनेंगे, क्योंकि कक्षाएं अन्य कक्षाओं से प्राप्त होती हैं। क्योंकि विरासत प्रोटोटाइप भाषाओं में वस्तुओं के बीच है, मैं कहूंगा कि "व्युत्पन्न वस्तु" समझ में आता है।

+1

मैं अपने उत्तर में विस्तारित कारणों के लिए व्युत्पन्न वस्तु शब्द का उपयोग नहीं करूंगा। –

+0

@ErikReppen मैंने आपके उत्तर को ऊपर उठाया है, लेकिन मेरा जवाब जेएस (रचनाकारों पर विचार नहीं) से स्वतंत्र होना था। जब कोई ऑब्जेक्ट * प्रोटोटाइप से "बनाया गया" * होता है तो यह एक तरह का व्युत्पन्न होता है: आप एक प्रोटोटाइपिकल सर्कल से एक वृत्त को _derive_ करते हैं। यह जेएस में सच है, जिसमें फ़ंक्शन के साथ बनाए गए ऑब्जेक्ट्स के प्रोटो के लिए उपयोग किए जाने वाले प्रत्येक फ़ंक्शन पर प्रोटोटाइप प्रॉपर्टी है, आप गतिशील रूप से "प्रकार" की प्रकृति को बदल सकते हैं। और मुझे विश्वास है कि जावास्क्रिप्ट में, 'new'' Object.create' से बेहतर है। फिर भी, 'Object.create' कहता है "मुझे इस मौजूदा की तरह एक नई वस्तु बनाएं" –

+0

मैं जेएस के बाहर प्रोटोटाइप से परिचित नहीं हूं लेकिन मेरा मानना ​​है कि व्यापक संदर्भ में एक उचित बिंदु है जहां संपत्तियों को क्लोन किया गया है किसी मौजूदा ऑब्जेक्ट का संदर्भ देने वाले कॉल-ऑब्जेक्ट से जुड़ा हुआ है। –

0

पी ओ और ओ की प्रोटोटाइप श्रृंखला नीचे होगा, पी की प्रोटोटाइप श्रृंखला होगी। प्रोटोटाइप श्रृंखला का उपयोग तब किया जाता है जब एक निश्चित सदस्य सीधे उदाहरण पर नहीं पाया जा सकता है। जावास्क्रिप्ट केवल प्रोटोटाइप श्रृंखला दिखेगा जब तक यह सदस्य पाता है या अपरिभाषित लौट: https://stackoverflow.com/a/16063711/1641941

var o = {o:22} 
var p = Object.create(o); 
p.p = 33; 
var q = Object.create(p); 
console.log(q); 
console.log(q.__proto__); 
console.log(q.__proto__.__proto__); 
+0

मैं नामकरण के बारे में पूछ रहा था। – user3025492

+0

@ user3025492 सुनिश्चित नहीं है कि व्युत्पन्न का उपयोग करना एक अच्छा शब्द है या नहीं। यह आपको कक्षा आधारित शर्तों के बारे में सोचता रहता है। लेकिन मुझे लगता है कि आप इसे जो कुछ भी चाहते हैं उसे कॉल कर सकते हैं क्योंकि अधिकांश जेएस प्रोग्रामर इसके अस्तित्व से अनजान हैं: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain – HMR

3

नोट: वास्तव में हर वस्तु के प्रोटोटाइप वास्तव में निर्माता के लिए एक संदर्भ है। तो यह गलत है- हालांकि प्रत्यक्ष संबंधों के बारे में बात नहीं है। प्रोटोटाइप ऑब्जेक्ट को अभी भी स्वैप किया जा सकता है लेकिन प्रोटोटाइप वास्तव में ऑब्जेक्ट से जुड़ा हुआ है और __proto__ या Object.getPrototypeOf(instance) (प्रोटो मानक के साथ सीधे एक्सेस नहीं किया जा सकता है इसलिए ऑब्जेक्ट.getप्रोटोटाइपऑफ उपलब्ध होने पर अधिक आदर्श है)।

मुझे लगता है कि किसी ऑब्जेक्ट के कन्स्ट्रक्टर के प्रोटोटाइप वाले शब्दों के बारे में सोचना बेहतर होता है। के मामले में तो

function objCreate(prototypeObject){ 
    var constructor = function(){}; 
    constructor.prototype = prototypeObject; 

    return new constructor; 
} 

: एक समारोह है कि इस तरह दिखता है के रूप में Object.create के बारे में सोचो

var o = {foo: 'bar'}; 
var p = objCreate(o); 

ओ पी के निर्माता के प्रोटोटाइप संपत्ति को सौंपा गया है।

अब इस बाहर की जाँच:

alert(p.foo);//'bar' 

p.constructor.prototype = { foo: 'foobiedoobie', bar: 'ubarfu' } 
alert(p.foo);//'foobiedoobie' // and we could access bar if we wanted to 

कि munges क्या वास्तव में हो रहा है के दो प्रकार के बीच एक सीधा संबंध इस बात पर ज़ोर शब्द "व्युत्पन्न" या कुछ और के उपयोग क्योंकि आप के प्रोटोटाइप संपत्ति बाहर स्वैप सकता है पी के कन्स्ट्रक्टर किसी भी समय, पी के कन्स्ट्रक्टर के सभी उदाहरणों के लिए उपलब्ध सभी गुणों को पीछे हटाना। पी ओ से व्युत्पन्न नहीं है। ओ है, जब तक हम इसे बदल नहीं लेते, बैकअप ऑब्जेक्ट जिनके गुणों की जांच की जाती है यदि आप ऐसी संपत्ति के लिए कॉल करते हैं जो पी नहीं है। और फिर यदि उस बैकअप ऑब्जेक्ट में यह नहीं है, तो जेएस कॉल ऑब्जेक्ट अपने कन्स्ट्रक्टर के प्रोटोटाइप की जांच करता है और इस तरह श्रृंखला को ऊपर रखता है।

यही कारण है कि मैं व्यक्तिगत रूप से Object.create या नए आने वाले वर्ग वाक्यविन्यास को पसंद नहीं करता हूं। यह सब एक ही काम करता है लेकिन हम वास्तव में बहुत कम सिंटैक्स चीनी जीत के लिए जो कुछ भी चल रहे हैं, उसे दफन करते हैं जो पानी को सिंटैक्स के लिए थोड़ा अस्पष्ट बनाता है, हम आसानी से खुद को उत्पन्न कर सकते हैं।

तो ओ के संबंध में पी क्या है?

पी एक निर्माता का एक उदाहरण है जो इस समय प्रोटोटाइप के रूप में होता है।

वहां कोई सीधा संबंध नहीं है। किसी पर जोर देने का प्रयास करने से केवल लोगों को भ्रमित कर दिया जाएगा और वे याद करेंगे कि वास्तव में यह वास्तव में कितना शक्तिशाली काम करता है। आप अधिकांश भाषाओं में कक्षा को स्वैप नहीं कर सकते हैं और सभी नई विरासत संपत्तियां अचानक कॉल करने योग्य हैं। आप जेएस में कर सकते हैं। ऐसा इसलिए है क्योंकि यह बैलेंस ऑब्जेक्ट्स की एक श्रृंखला की तरह है जो संपत्तियों की जांच करने के लिए सीधे विरासत योजना के साथ उदाहरण पर सेट नहीं है।

+0

ऑब्जेक्ट.क्रेट वास्तव में जब आप शास्त्रीय विरासत दृष्टिकोण को त्याग देते हैं तो चीजों को और अधिक स्पष्ट बनाता है। यदि आपके ऑब्जेक्ट को कन्स्ट्रक्टर की आवश्यकता है, तो "create" विधि जोड़ें जो ऑब्जेक्ट.क्रेट (यह) करता है और प्रारंभ करता है। रचनाकारों को प्रोटोटाइप संलग्न करने की गड़बड़ी की कोई ज़रूरत नहीं है। –

+0

या आप एक ऐसी विधि बना सकते हैं जो ऑब्जेक्ट.क्रेट करता है:)। हालांकि मैं वास्तव में एक नफरत नहीं हूँ। मैं बस ऑपरेटर ओवरलोडिंग या कुछ की तरह संरक्षणवादी कोडर riffraff दूर रखने के लिए कुछ और भयावह करने की कोशिश की थी। –

संबंधित मुद्दे