(1) मुझे नहीं लगता कि अकेले मेमोरी को संरक्षित करना प्रोप्रोटाइप का उपयोग करने का एक वैध कारण है, जब तक आप डुप्लिकेटिंग ऑब्जेक्ट्स के साथ वास्तव में चरम नहीं हो जाते।
(2) स्थैतिक गुणों का विचार वास्तव में उपयोग करने का एक कारण नहीं है। प्रोटीोटाइप या तो (IMHO), क्योंकि यह पारंपरिक स्थिर संपत्ति की तरह व्यवहार नहीं करता है। आप (जहां तक मुझे पता है) हमेशा "स्थिर" संपत्ति तक पहुंचने से पहले ऑब्जेक्ट इंस्टेंस की आवश्यकता होती है, जो इसे स्थिर नहीं बनाता है।
function Car() {}
Car.prototype.Engine = "V8";
// I can't access Car.Engine... I'll always need an instance.
alert(new Car().Engine);
// or
var car1 = new Car();
alert(car1.Engine); //you always need an instance.
//unless you wanted to do
alert(Car.prototype.Engine); //this is more like a static property, but has an
//unintended consequence that every instance of Car also receives a .Engine
//behavior, so don't do this just to create a "static property."
यह ध्यान देने योग्य है कि इस "स्थिर" विचार न केवल गुण लेकिन सभी सदस्यों, जो विधि (कार्यों) भी शामिल है पर लागू होता है, एक पारंपरिक OO नजरिए से।
प्रोटोटाइप (फिर से, आईएमएचओ) के बारे में सोचना बेहतर है क्योंकि इंजेक्शन वाले सिंगलटन ऑब्जेक्ट्स जो व्यवहार ऑब्जेक्ट्स से जुड़े होते हैं। कार() के सभी उदाहरणों में अपने स्वयं के इंस्टेंस सदस्य हो सकते हैं, लेकिन कार() के हर उदाहरण को सभी कार.प्रोटोटाइप के सदस्यों/व्यवहारों के साथ "स्वचालित रूप से" इंजेक्शन दिया जाएगा। यह तकनीकी रूप से वही नहीं है, लेकिन मुझे इस तरह प्रोटोटाइप के बारे में सोचना सुविधाजनक लगता है।
//define Car and Car.GoFast
function Car() {}
Car.prototype.GoFast = function() { alert('vroom!'); };
var car1 = new Car();
var car2 = new Car();
car1.GoFast();
car2.GoFast(); //both call to same GoFast implementation on Car.prototype
//change the GoFast implementation
Car.prototype.GoFast = function() { alert('vvvvvrrrrroooooooooommmmm!!!!!'); };
car1.GoFast();
car2.GoFast(); //both have been "updated" with the new implementation because
//both car1 and car2 are pointing to the same (singleton) Car.prototype object!
Car.prototype एक सिंगलटन वस्तु जिसके सदस्य/व्यवहार प्रकार कार के कहने वस्तुओं में इंजेक्ट कर दिया है की तरह बर्ताव कर रहा है।
(3) प्रोटोटाइप विरासत के लिए भ्रमित नहीं होना चाहिए। आप व्यवहार प्राप्त कर सकते हैं जो विरासत में प्रतीत होता है, लेकिन ऐसा नहीं है। प्रोटोटाइप पर सदस्य/व्यवहार प्रोटोटाइप ऑब्जेक्ट पर रहते हैं। वे आपकी व्युत्पन्न कक्षा के सदस्य/व्यवहार नहीं बनते हैं, जैसे कि वास्तविक विरासत। यही कारण है कि मैं इसे आपके उदाहरण में "इंजेक्शन" प्रोटोटाइप की तरह वर्णन करता हूं।
function Car() {}
Car.prototype.Engine = "V8";
var car1 = new Car();
var car2 = new Car();
alert(car1.Engine); //alerts "V8"
//There is no "Engine" variable defined within the instance scope of 'car1'.
//Javascript searches the scope of car1's Type.prototype object to find 'Engine'.
//Equivalent to: Object.getPrototypeOf(car1).Engine
//But if we create 'Engine' within the scope of car1
car1.Engine = "V6"; //Car.prototype was never accessed or updated
alert(car1.Engine); //we get "V6"
alert(car2.Engine); //we still get "V8"
alert(Object.getPrototypeOf(car1).Engine); //we still get "V8"!
तो सीधे सवाल का जवाब देने: वहाँ प्रोटोटाइप का उपयोग कर के बजाय वस्तु पर ही गुण घोषित करने का कोई लाभ है?
हां, जब आप किसी दिए गए प्रकार की ऑब्जेक्ट्स के बीच व्यवहार कार्यान्वयन साझा करना चाहते हैं।एक संयोग के रूप में, आप अपनी स्मृति पदचिह्न को कम कर देंगे, लेकिन प्रोटोटाइप का उपयोग करने के लिए यह अकेला कारण नहीं है। न तो "स्थैतिक गुण बनाना" (जो वे नहीं हैं), या विरासत के लिए (जो यह नहीं है) है।
मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं ... आपको लगता है कि "आप बस कर सकते हैं ...", लेकिन फिर उस स्क्रिप्ट में टिप्पणी में आप कहते हैं "इसे करने का कोई अच्छा तरीका नहीं है" । क्या वह खुद का विरोधाभास नहीं करता है? – Joeytje50
मुझे लगता है कि उन्हें एहसास हुआ कि सवाल पूछने के माध्यम से उनके विचार गलत तरीके से गलत थे। किसी भी दर पर वह 18 महीने पहले प्रश्न पोस्ट करने के बाद से स्टैक्सएक्सचेंज पर नहीं रहा है, इसलिए उसे संबोधित करने का कोई मतलब नहीं है। यह मैं था जो अभी भी सोच रहा है ... – Aerovistae
यदि आप प्रोटोटाइप का उपयोग नहीं करते हैं तो आप फ़ंक्शन mustang() {car.apply (यह) कर सकते हैं; } – Serge