2012-12-05 15 views
13

क्याजावास्क्रिप्ट विरासत

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

और

_.extend(Employee.prototype, Person.prototype); 

दोनों इसी तरह के परिणाम (उत्पादन) देते हैं, लेकिन अंडरस्कोर विधि के बीच अंतर करने के लिए Person.prototype जोड़ने के लिए लगता है कर्मचारी.कॉन्स्ट्रक्टर.प्रोटोटाइप, और यहाँ और वहां बहुत सारी चीज़ें छोड़ दें, क्यों?

शुद्ध जे एस

enter image description here

underscoreJS

enter image description here

_.extend का एक अच्छा पक्ष प्रभाव मैं आसानी से एकाधिक वंशानुक्रम क्या कर सकते हैं: की तरह यह does not भी प्रोटोटाइप श्रृंखला लंबे समय तक बना रहा है। ..

_.extend(Employee.prototype, Person.prototype); 
_.extend(Employee.prototype, { 
    doSomething: function() { 
     return "hi ..."; 
    } 
}); 

लेकिन ...

enter image description here

क्यों 2 SayHi और DoSomething कार्यों है? (वास्तव में यह वही है जब मैं केवल 1 विस्तार करता हूं)।

http://jsfiddle.net/VMqSy/1/

उत्तर

17

Employee.prototype = Object.create(Person.prototype); के साथ आप पूरी तरह से Employee.prototype ले रही हैं।

लेकिन _.extend(Employee.prototype, Person.prototype); के साथ आप के शीर्ष पर Person.prototype जोड़ रहे हैं।

उदाहरण के लिए,

var a = {var1:1, var2:2}; 
var b = {var2:4, var3:3}; 
console.log(_.extend(a, b)); // {var1:1, var2:4, var3:3} 

जैसा कि आप देख, a यह पूरी तरह से b द्वारा प्रतिस्थापित नहीं कर रहा है, यह सिर्फ गुण b में परिभाषित द्वारा बढ़ाया है।

+0

एक और अंतर '_.extend'' constructor.prototype' ('.extend' 'नहीं बढ़ाता है? क्या यह वही है"? उनके अलावा विभिन्न स्थानों में? –

+0

'_.extend' पहले ऑब्जेक्ट को पारित करता है, इसलिए, मेरे उदाहरण में, 'बी' छूटा रहता है, लेकिन 'ए' वास्तव में' बी' द्वारा बढ़ाया जाता है। '_.extend ({}, ए, बी)', 'ए' और' बी' में छूटे रहेंगे, और '{}' यह उनके गुणों द्वारा बढ़ाया गया है। – rdiazv

+0

ध्यान दें कि यदि आप इसे इस तरह से करते हैं, यानी '_.extend (कर्मचारी.प्रोटोटाइप, व्यक्ति.प्रोटोटाइप);', 'नए' के ​​साथ बनाए गए किसी भी उदाहरण से आपको 'कर्मचारी' वापस मिल जाएगा, और कर्मचारी एक नहीं होगा 'व्यक्ति', यानि 'नया कर्मचारी() व्यक्ति का उदाहरण' झूठा 'होना चाहिए। – user3743222

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