5

Bir üst öğeden miras alan özelliklerine sahip olmaya çalışıyorum ancak bunu doğru şekilde yapma konusunda net değilim.JS'de prototip kalıtım ve üst özelliklerin nasıl edinileceği

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; 
} 

Şimdi bu yüzden elle ebeveynden şeyi eklemek gerekmez bir alt prototip devralma eklemek istiyorum:

Ben düşünelim. Örneğin, bir Animal

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

olsaydı gibi el Cat name ve createOffspring eklemek zorunda olmadan, bu yapmak istiyorum ben Animal

bir Cat tabanlı eklemek istediğiniz Diyelim constructor gerçekten sadece bir Animal, ancak bazı diğer ek işlevsellik ile (.meow() veya bir şey gibi).

cevap

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 

That's it? (UPD: Sabit prototip ile Hatası) :


Orada da başka bir çözüm, ama onun Krom (UPD2. Üzgünüm O, ben hatalar bir çok .. Ben uyku gitmek gerekir gece geç yapmak olduğunu), FF özgü (belki diğerleri):

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

kısa görünüyor ama bu tarafından cazip not'd: Bu ECMAScript standardını takip etmek daha iyidir.

+0

Bunu test etmem gerekiyor, ama _not_ 'this.name' işlemini yinelemek zorundayım, çünkü _all_ hayvanları bir ada sahip olacak, 'this.name =' Bir kedi '; 'kaldırılabiliyor olmalı ve 'cat.name'' bir hayvan ' –

+0

Ah, geri dönmelidir. Sizi yanlış cevapla yanlış yönlendiriyorum: Animal.prototype ayarlanmadı, bu yüzden 'cat.name' bir istisna verecekti. Doğru yol, örnek dinamik olarak oluşturulduğunda, bir protoma bir nesne atamaktır: 'Cat.prototype = Object.create (yeni Animal())' –

+0

Bu beni doğru yönde yakaladı ve çok teşekkür ederim. Maalesef bu garip görünmektedir tek şey 'Cat.prototype.constructor = Kedi o vardır :) çok uzun sürdü;' ya değil kodda aynı şekilde çalışır ve hala 'instanceof' üzerinde' TRUE olsun s. Ayrıca 'Object.create()' satırı 'cat.name' undefined yapar. http://jsbin.com/uhogig/edit#javascript,html –

0

JavaScript'te tarif ettiğiniz gibi miras uygulanması için farklı desen vardır ve bunlar kadarıyla onlar prototip nesneleri nasıl ele kadar ince farklar vardır.

Başlamak için prototype pattern ve constructor pattern hakkında bir çift iyi referans vardır.

Ve burada anlattığınız şeyin bir simple implementation.