2013-02-23 15 views
7

सेट करते समय ऑब्जेक्ट.क्रेट को कॉल करना मैं ऑब्जेक्ट उन्मुख जावास्क्रिप्ट के कुछ पहलुओं को सीख रहा हूं। क्यों इस स्निपेट का उपयोग करता है Object.create (Person.prototype): मैं इस टुकड़ाजावास्क्रिप्ट विरासत: प्रोटोटाइप

var Person = function(firstName, lastName) 
{ 
    this.lastName = lastName; 
    this.firstName = firstName; 
}; 

Object.defineProperties(Person.prototype, { 
    sayHi: { 
    value: function() { 
     return "Hi my name is " + this.firstName; 
    } 
    }, 
    fullName: { 
    get: function() { 
     return this.firstName + " " + this.lastName; 
    } 
    } 
}); 

var Employee = function(firstName, lastName, position) { 
    Person.call(this, firstName, lastName); 
    this.position = position; 
}; 

Employee.prototype = Object.create(Person.prototype); 

var john = new Employee("John", "Doe", "Dev"); 

में आए और मेरे सवाल है? क्या हमें बस प्रोटोटाइप को रीसेट नहीं करना चाहिए:

Employee.prototype = Person.prototype; 
+2

एक महान [जवाब] (http://stackoverflow.com/questions/15040955/javascript-oop-and-prototypes-with-multiple-level-inheritance?answertab=active#: या वहाँ इस छोटे से नृत्य है टैब-टॉप) आज से इस तक। – marekful

+0

वाह। उसके लिए धन्यवाद। अध्ययन के लिए बुकमार्क किया गया! :-) –

+0

[संख्या] (http://stackoverflow.com/q/12500637/1048572) – Bergi

उत्तर

9

Employee.prototype = Person.prototype कर कह रही है "कर्मचारी व्यक्ति है" के बजाय की तरह है "कर्मचारी एक व्यक्ति है।" प्रोटोटाइप में कोई भी परिवर्तन दोनों कक्षाओं में दिखाई देगा।

यहां एक demonstration है। जाहिर है हम नहीं चाहते कि हमारे लोग काम कर रहे हों क्योंकि उनके पास कोई स्थिति नहीं है।

तो सही तरीके से सेटअप करने के लिए Object.create बिना प्रोटोटाइप श्रृंखला है:

Employee.prototype = new Person; 

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

इस मामले में यह कोई बड़ा सौदा नहीं है - कर्मचारी कन्स्ट्रक्टर उन संपत्तियों को अपने आप सेट करने जा रहा है जो व्यक्ति से विरासत में संपत्तियों का अधिग्रहण करेंगे। लेकिन this example पर विचार करें। कोई ऐसा सोच सकता है कि फ्रीटाइम व्यक्ति के लिए एक उदाहरण स्तर की संपत्ति है जिसे कॉपी नहीं किया जाएगा क्योंकि यह प्रोटोटाइप पर नहीं है। इसके अलावा, हमने कभी कर्मचारी से व्यक्ति कन्स्ट्रक्टर नहीं कहा। ऐसा नहीं - फ्रीटाइम कर्मचारी प्रोटोटाइप पर सेट था क्योंकि हमें किसी ऑब्जेक्ट को तुरंत चालू करना पड़ा था।

तो ऑब्जेक्ट.क्रेट के माध्यम से आप कर सकते हैं सबसे अच्छी और साफ विरासत है। यदि आप अभिभावक वर्ग 'कन्स्ट्रक्टर को कॉल करना चाहते हैं, तो आप सबक्लास' कन्स्ट्रक्टर के भीतर से स्पष्ट रूप से ऐसा कर सकते हैं। एक और अच्छी बात यह है कि Object.create को परिभाषित करने के लिए एक दूसरा (वैकल्पिक) तर्क है। तो आप यह भी कर सकते हैं:

Employee.prototype = Object.create(Person.prototype, { 
    work: { 
    value: function() { 
     return this.fullName+" is doing some "+this.position+" stuff"); 
    } 
    } 
}); 

बेशक, यदि आपको विरासत ब्राउज़र का समर्थन करना है तो आप ऑब्जेक्ट.क्रेट का उपयोग नहीं कर सकते हैं। विकल्प अंडरस्कोर या लॉनाश जैसे पुस्तकालयों से क्लोन/विस्तार का उपयोग करना है।

var subclass = function() { }; 
subclass.prototype = Person.prototype; 
Employee.prototype = new subclass; 
+0

यह सही तरीका क्यों है? मेरा मतलब है, क्या होगा यदि व्यक्ति ऑब्जेक्ट में गुण/फ़ील्ड हैं (firstName, lastName)? क्या कर्मचारी के प्रोटोटाइप को इसका उपयोग करना चाहिए? और मुझे अंतिम नाम और प्रथम नाम प्रदान करने की आवश्यकता है क्योंकि कन्स्ट्रक्टर फ़ंक्शन की आवश्यकता होती है। – dragonfly

+0

एक प्रदर्शन के साथ अद्यतन किया गया। –

+0

मुझे लगता है कि यहां दिया गया उदाहरण एक बुरा है। मैं * बच्चे ऑब्जेक्ट में 'फ्रीटाइम' की प्रतिलिपि बनाने की अपेक्षा करता हूं क्योंकि यह माता-पिता के निर्माता में सेट है, और आप उस निर्माता को बच्चे के कन्स्ट्रक्टर से कॉल करने के लिए हैं। – Jez

1

मेरा अनुमान है कि इरादा सिर्फ व्यक्ति से संदर्भ के बजाय एक नई वस्तु बनाना है।

//create a new object with its prototype assigned to Person.prototype 
Employee.prototype = Object.create(Person.prototype); 
संबंधित मुद्दे