अंतर है जहां प्रोटोटाइप श्रृंखला में संपत्ति स्थित है।
मान लें कि हमारे पास f = new foo();
और b = new baz()
है।
foo
की परिभाषा एक प्रोटोटाइप का उपयोग किए बिना:
+-----------+ +---------------+
| f | | foo.prototype |
| __proto__-+---->| constructor |
| bar | | |
+-----------+ +---------------+
bar
वस्तु ही (f.howOwnProperty('bar')
रिटर्न true
) की संपत्ति है तो हम निम्न स्थितियों की है।
आप के बजाय प्रोटोटाइप करने के लिए संपत्ति असाइन करते हैं, स्थिति यह है:
+-----------+ +---------------+
| f | | foo.prototype |
| __proto__-+---->| constructor |
| | | bar |
+-----------+ +---------------+
f
अपनी ही संपत्ति bar
नहीं है, लेकिन संपत्ति अन्य सभी foo
उदाहरणों के साथ साझा है।
दूसरा टुकड़ा, जिसमें या तो परिणाम के लिए इसी तरह
+-----------+ +---------------+ +---------------+
| b | | foo instance | | foo.prototype |
| __proto__-+---->| __proto__ -+---->| constructor |
| | | bar | | |
+-----------+ +---------------+ +---------------+
या
+-----------+ +---------------+ +---------------+
| b | | foo instance | | foo.prototype |
| __proto__-+---->| __proto__ -+---->| constructor |
| | | | | bar |
+-----------+ +---------------+ +---------------+
क्यों आप ऐसा करना चाहते हैं?
यह मुख्य रूप से संरचना के बारे में है और स्मृति को बर्बाद नहीं कर रहा है। आप एक निर्माता समारोह में एक वस्तु के लिए काम करता है जोड़ सकते हैं:
function Foo() {
this.bar = function() {};
}
लेकिन यह भी मतलब है कि Foo
के प्रत्येक उदाहरण अपने आप कार्य है, कि है, f1.bar === f2.bar
false
है, हालांकि दोनों कार्यों सटीक एक ही बात कर रहे हैं।
प्रोटोटाइप का उपयोग करके आप सभी उदाहरणों और उदाहरण-विशिष्ट लोगों के लिए सामान्य गुणों को अलग करने का एक साफ तरीका प्रदान करते हैं।
अंत में, यह "बस" विरासत है जो सॉफ़्टवेयर विकास (एकत्रीकरण) में एक अवधारणा है और इसका उपयोग कहीं भी किया जा सकता है। आपका दूसरा स्निपेट मूल रूप से इसका मतलब है कि baz
is-afoo
है, इसलिए baz
उदाहरण, इसके गुणों के अतिरिक्त, foo
उदाहरण (विरासत) के समान गुण हैं।
+1 स्पष्टीकरण पर मेरे प्रयास से काफी बेहतर :) –