मैं जावास्क्रिप्ट में किसी फ़ंक्शन में प्रोटोटाइप विरासत को लागू करने का प्रयास कर रहा हूं। यह सब सुंदर सादा है और यहां तक कि Wikipedia's javascript lemma में वर्णित है। यह काम करता है अगर मेरे गुण सरल जावास्क्रिप्ट प्रकार हैं:जावास्क्रिप्ट प्रोटोटाइप विरासत और ऑब्जेक्ट गुण
function Person() {
this.age = 0;
this.location = {
x: 0,
y: 0,
absolute: false
};
};
function Employee() {};
Employee.prototype = new Person();
Employee.prototype.celebrate = function() {
this.age++;
}
var pete = new Employee();
pete.age = 5;
pete.celebrate();
var bob = new Employee();
bob.celebrate();
console.log("bob is " + bob.age + " pete is " + pete.age);
Employee.prototype = new Person();
साथ
, सभी व्यक्ति के गुण और (नमूने) तरीके कर्मचारी है, जो विरासत के लिए मौलिक है से प्राप्त होती हैं।
यह अपेक्षा के अनुरूप काम करता है: bob is 1 pete is 6
अब मैं पीट स्थान के साथ बेला को शुरू कर (जश्न मनाने के बाद)
pete.celebrate();
pete.location.absolute=true;
प्रदर्शित bob.location.absolute पता चलता है: true
, (जो विपरीत सहज है मैंने बॉब के स्थान को स्पर्श नहीं किया है, इसलिए मुझे उम्मीद है कि इसे Person
में प्रारंभिक मूल्य घोषित किया जाएगा) और मेरा समाधान बर्बाद कर देगा।
मेरी प्रारंभिक समझ में यह गलत होना चाहिए था। मुझे एहसास है कि मुझे शायद प्रारंभिक व्यक्ति से स्थान वस्तु को क्लोन करना चाहिए, लेकिन मुझे यकीन नहीं है कि यह कहां या कैसे करें। और यदि विरासत के लिए शायद बेहतर तकनीकें हैं?
नए व्यक्ति() के बजाय createObject (व्यक्ति) का उपयोग करने का उछाल क्या है? यह केवल प्रोटोटाइप संकेत की एक परत जोड़ता है। विरासत के दौरान एक कन्स्ट्रक्टर चलाने से साइड इफेक्ट्स से बचने के लिए – Kosta
@ कोस्टा। कन्स्ट्रक्टर्स में आमतौर पर प्रारंभिक कोड होता है जिसे आप तब तक नहीं चलाना चाहते जब आप कुछ भी तत्काल नहीं कर रहे हों। एक 'नया कर्मचारी' अभी भी व्यक्ति का उदाहरण होगा क्योंकि दोनों व्यक्ति'prototype' और 'f.prototype' एक ही वस्तु को इंगित करते हैं। – Esailija
लेकिन आप अभी भी createObject() (एक बार) में कन्स्ट्रक्टर चला रहे हैं। साथ ही, आप कर्मचारी() में प्रत्येक कन्स्ट्रक्शन में कन्स्ट्रक्टर चला रहे हैं। क्या आप एक उदाहरण दे सकते हैं जहां createObject() उपयोगी है? – Kosta