5

मैं गुणों को माता-पिता से प्राप्त करने की कोशिश कर रहा हूं, लेकिन मैं इसे करने के सही तरीके से स्पष्ट नहीं हूं।जेएस में प्रोटोटाइप विरासत और मूल गुण कैसे प्राप्त करें

var Animal = function(name){ 
    this.offspring = []; 
    this.name = name; 
    return this; 
} 

Animal.prototype.createOffspring = function(name){ 
    name = name || 'Baby '+(this.offspring.length+1); 
    this.offspring.push(name); 
    return this; 
} 

अब मैं एक उप प्रोटोटाइप इनहेरिट जोड़ने के लिए तो मैं मैन्युअल रूप से माता पिता से सब कुछ जोड़ने के लिए नहीं करना चाहती:

कहते हैं कि मैं है की सुविधा देता है। उदाहरण के लिए, की सुविधा देता है मैं से Animal

एक Cat आधारित जोड़ना चाहते हैं मैं यह करने के लिए करना चाहते हैं, मैन्युअल रूप से बिल्ली को name और createOffspring जोड़े बिना की तरह ही वह एक Animal

var pet = new Cat('Kitty'); 
pet.createOffspring(); 

थे constructor जो वास्तव में केवल Animal है, लेकिन कुछ अन्य अतिरिक्त कार्यक्षमता के साथ (जैसे .meow() या कुछ)।

उत्तर

4
// Parent 
function Animal() { 
    this.name = 'An animal'; 
} 

// Some child 
function Cat() { 
    this.speaks = 'Meow'; 
} 
// Here comes inheritence 
Cat.prototype = new Animal(); 
// Or like that 
// but don't forget to put all inheritable fields to Animal's prototype 
Cat.prototype = Object.create(Animal.prototype); 

// Let 'instanceof' work. Don't forget the following line, 
// because we eraese the info about constructor of Cat instances. 
Cat.prototype.constructor = Cat; 
// Add some custom method 
Cat.prototype.meow = function() { return this.speaks; } 

var cat = new Cat(); 
var animal = new Animal(); 

/// Some tests 
cat.name; // A animal 
animal.name; // An animal 
cat.meow(); // Meow! 
cat instanceof Cat; // true 
cat instanceof Animal; // true 

क्या यह है? (युपीडी: प्रोटोटाइप तय साथ त्रुटि) (UPD2:। क्षमा करें यह देर रात, मैं गलतियों का एक बहुत .. मैं नींद से जाना चाहिए बनाने के है)


भी एक और समाधान नहीं है, लेकिन इसकी क्रोम, एफएफ विशेष (शायद अन्य):

// Animal and Cat functions from above, but 
Cat.prototype = { 
    __proto__: Animal.prototype, 
    constructor: Cat, 
    meow: function() { ... } 
} 

कम लग रहा है, लेकिन यह द्वारा परीक्षा हो not'd: यह ECMAScript standart पालन करने के लिए बेहतर है।

+0

मुझे इसका परीक्षण करने की आवश्यकता है, लेकिन मैं _not_ को 'this.name' को फिर से करना होगा क्योंकि _all_ जानवरों का नाम होगा,' this.name = 'a cat'; 'हटाया जा सकता है और 'cat.name' को 'जानवर' –

+0

वापस करना चाहिए, क्षमा करें। मैं आपको गलत जवाब देने के लिए गुमराह करता हूं: Animal.prototype सेटअप नहीं किया गया था, इसलिए 'cat.name' एक अपवाद देगा। सही तरीका, जब उदाहरण गतिशीलता का निर्माण होता है, तो किसी ऑब्जेक्ट को प्रोटो को असाइन करना होता है: 'Cat.prototype = Object.create (नया पशु()) ' –

+0

यह मुझे सही दिशा में मिला और आपको बहुत धन्यवाद। खेद है कि यह बहुत लंबा लगा :) अजीब लगने वाली एकमात्र चीजें हैं कि 'Cat.prototype.constructor = Cat;' कोड में या नहीं, वही काम करता है और मुझे अभी भी 'example' पर 'सत्य' मिलता है रों। इसके अलावा 'ऑब्जेक्ट.क्रेट() 'लाइन' cat.name' को अपरिभाषित करती है। http://jsbin.com/uhogig/edit#javascript,html –

0

विरासत को लागू करने के लिए कई अलग-अलग पैटर्न हैं जैसे कि आप जावास्क्रिप्ट में वर्णन कर रहे हैं, और उनके पास सूक्ष्म मतभेद हैं जहां तक ​​वे प्रोटोटाइप ऑब्जेक्ट्स का इलाज करते हैं।

यहां शुरू करने के लिए prototype pattern और constructor pattern पर कुछ अच्छे संदर्भ दिए गए हैं।

और यहां वर्णित simple implementation है।