2015-07-03 8 views
5

मुझे लगता है कि मैं जेएस में प्रोटोटाइपिकल विरासत को समझता हूं लेकिन मेरे पास एक विशेष विचार दिखाने के लिए कोड लिखने में परेशानी हो रही है। इस अत्यंत सरल परिदृश्य में, जहां प्रबंधक वस्तुओं कर्मचारी वस्तुओं से निकाले जाते हैं पर विचार करें:प्रोटोटाइप के बिना प्रोटोटाइपिकल विरासत?

function Employee() 
{ 
    this.name = "Axel"; 
    this.dept = "R&D"; 
} 

function Manager() 
{ 
    Employee.call(this); 
    this.reports = ["Report 1", "Report 2", "Report 3"]; 
} 

console.log(new Manager()); 

उत्पादन होता है:

Manager {name: "Axel", dept: "R&D", reports: Array[3]} 

अजीब तरह से पर्याप्त है, यह है कि हम प्रोटोटाइप विरासत का प्रदर्शन में सफल रहा है मुझे लगता है। लेकिन तथ्यों का हमने उपयोग नहीं किया prototype कहीं भी मुझे परेशान करता है। निश्चित रूप से उपर्युक्त कोड ऐसा करने का तरीका नहीं है?

क्या कोई ऐसा उदाहरण प्रदान कर सकता है जो उपर्युक्त दृष्टिकोण को विफल कर दिखाता है?

(वैसे, उदाहरण के आधिकारिक मोज़िला डॉक्स से आता है, शून्य से प्रोटोटाइप का सेटिंग: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model)

+0

उपर्युक्त दृष्टिकोण में कुछ भी गलत नहीं है। इस मामले में आप केवल * एकल ऑब्जेक्ट * को संशोधित करते हैं, जबकि प्रोटोटाइप के साथ, आप उसी प्रोटोटाइप के साथ * सभी ऑब्जेक्ट्स * को संशोधित कर सकते हैं। – meskobalazs

+0

@meskobalazs मुझे डर है कि मेरे क्लासिकली-प्रशिक्षित दिमाग का पालन नहीं करता है। यदि मैं 'नए प्रबंधक()' के बारे में लिखता हूं तो क्या मुझे तीनों गुण (नाम, डिप्टी और रिपोर्ट) नहीं मिलेंगे? इस प्रकार, ऐसा लगता है कि सड़क के नीचे __all ऑब्जेक्ट्स आगे संशोधित हैं। – dotslash

+2

आप यहां प्रोटोटाइप या प्रोटोटाइपिकल विरासत का उपयोग नहीं कर रहे हैं। इसके बजाय, आप प्रत्येक व्यक्तिगत ऑब्जेक्ट पर सीधे गुण सेट कर रहे हैं। –

उत्तर

2

हम इसे विभिन्न टिप्पणियों में लात मार रहे हैं, लेकिन मैं एक ऐसा उदाहरण देना चाहता था जो चीजों को स्पष्ट करने में मदद कर सके। अपने मूल कोड के साथ शुरू:

function Employee() 
{ 
    this.name = "Axel"; 
    this.dept = "R&D"; 
} 

function Manager() 
{ 
    Employee.call(this); 
    this.reports = ["Report 1", "Report 2", "Report 3"]; 
} 

console.log(new Manager()); 

हम भी तो जैसे बिल्कुल एक ही बात कर सकता है:

function setEmployee(emp) 
{ 
    emp.name = "Axel"; 
    emp.dept = "R&D"; 
} 

function Manager() 
{ 
    setEmployee(this); 
    this.reports = ["Report 1", "Report 2", "Report 3"]; 
} 

console.log(new Manager()); 

अब हम .call() या .apply() या कुछ भी तो कल्पना उपयोग नहीं किया है। Manager कन्स्ट्रक्टर बस एक और फ़ंक्शन कॉल करता है और इसे this मान सीधे तर्क के रूप में पास करता है। कोड वैसे ही वही काम करता है जैसा उसने पहले किया था।

हम इसे एक कदम आगे ले सकता है:

function setEmployee(emp) 
{ 
    emp.name = "Axel"; 
    emp.dept = "R&D"; 
} 

function createManager() 
{ 
    var emp = {}; 
    setEmployee(emp); 
    emp.reports = ["Report 1", "Report 2", "Report 3"]; 
    return emp; 
} 

console.log(createManager()); 

अब हम कंस्ट्रक्टर्स उपयोग नहीं कर रहे हैं और यहां तक ​​this का उपयोग नहीं - हम सिर्फ स्पष्ट रूप से एक वस्तु बना रहे हैं और कार्यों के बीच के आसपास इसे पारित, और कोड अभी भी वही काम करता है!

+0

प्रयास के लिए धन्यवाद। हां, यह चीजों को बहुत स्पष्ट करता है। – dotslash

1
new Manager() instanceof Manager 
> true 
new Manager() instanceof Employee 
> false 
+0

उत्कृष्ट! कम से कम यह पुष्टि हुई है कि मैं विरासत के नाम पर बकवास कर रहा था। : डी – dotslash

2

आप वास्तव में कुछ भी वारिस नहीं था। आपने किसी दिए गए ऑब्जेक्ट पर फ़ंक्शन को "लागू" किया है। मुझे लगता है कि कई कार्यात्मक भाषाएं यह कर सकती हैं।

विरासत का उपयोग किया जाता है, उत्तराधिकारी के लिए, किसी दिए गए ऑब्जेक्ट पर असंबद्ध कार्यों को लागू न करें।

आपके उदाहरण में आप उदाहरण के लिए तरीकों का उत्तराधिकारी कैसे कवर नहीं कर रहे हैं। भले ही आपने Proxy के माध्यम से विधि विरासत को कार्यान्वित करने का प्रयास किया, उदाहरण के लिए इसका मतलब यह नहीं है कि आपने माता-पिता को विरासत में मिला है।

+0

आह! तो आप का मतलब है 'नाम' और 'dept' ऊपर 'प्रबंधक' से संबंधित है, न कि 'कर्मचारी'? यदि हां, तो मैं इसकी पुष्टि कैसे कर सकता हूं? – dotslash

+1

आपके उदाहरण में, 'name' और' dept' या तो 'प्रबंधक' या 'कर्मचारी' के "संबंधित" नहीं हैं। वे गुण हैं जो आप प्रत्येक व्यक्तिगत वस्तु पर सेट कर रहे हैं, और 'प्रबंधक' या 'कर्मचारी 'के प्रोटोटाइप से कोई लेना देना नहीं है। –

+0

एक और तरीका रखें, जब सब कुछ कहा और किया जाता है, तो आपने अपनी ऑब्जेक्ट्स के साथ एक ऑब्जेक्ट बनाया है जिसे आपने स्पष्ट रूप से व्यक्तिगत ऑब्जेक्ट पर सेट किया है। इससे कोई फर्क नहीं पड़ता कि क्या गुण 'प्रबंधक' फ़ंक्शन या 'कर्मचारी' फ़ंक्शन में या कुछ अन्य यादृच्छिक फ़ंक्शन में सेट हैं जिन्हें आप स्पष्ट रूप से कॉल करते हैं। प्रत्येक मामले में वे * व्यक्तिगत वस्तु * के गुण होते हैं। –

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