2015-04-24 12 views
11

OOP'yi JavaScript ile çok basit örneklerle anlamaya çalışıyorum.Temel JavaScript Hayvanlar için Prototip ve Kalıtım Örneği

Amacım, örnek olarak Hayvanlar ile bir sınıf hiyerarşisi oluşturmaktır. Ben bu örneği alıp JavaScript içindeki sınıfları oluşturmak istiyorum

  Animal 
      /\ 
    Mammal  Reptile 
     /\   /\ 
    Human Dog Snake Alligator 

: basitleştirilmiş hayvan hiyerarşisinde

böyle bir şey görebilirsiniz. İşte benim girişimim. Daha iyi hale getirmek için ne yapabilirim? Ben yapmak istiyorum ne

function Animal(name) { 
    this.name = name; 
    } 

function Mammal() { 
    this.hasHair = true; 
    this.numEyes = 2; 
    this.blood = "warm"; 
} 

function Dog(breed) { 
    this.breed = breed; 
    this.numLegs = 4; 
} 

Dog.prototype = new Animal("Fido"); 
Dog.prototype = new Mammal(); 

var Fido = new Dog("Lab"); 

console.log(Fido.name); // returns undefined when i want it to return Fido 
console.log(Fido.hasHair); // returns true as expected 
console.log(Fido.breed); // returns lab as expected 

hem ama düzgün çalışmıyor çünkü köpek Memeli ve Hayvan özelliklerini genişletmek olması. Varsayım çünkü dog.prototype = yeni Mammal() yeni Animal() sonra bağlantı üzerine yazıyor çağırıyorum.

Ebeveyn sınıflarının tüm özelliklerini çağırabilmek için bu sınıfları düzgün şekilde nasıl yazarım?

Teşekkür ederiz.

+0

bulunabilir istediğin bu kabaca mi? http://jsfiddle.net/294d88su/ – aroth

cevap

7

Javascript'te biraz garip ama güçlü olan Prototypical Inheritance'dan yararlanmak istiyorsunuz.

function Animal(name) { 
    this.name = name; 
} 

// Example method on the Animal object 
Animal.prototype.getName = function() { 
    return this.name; 
} 

function Mammal(name, hasHair) { 
    // Use the parent constructor and set the correct `this` 
    Animal.call(this, name); 

    this.hasHair = hasHair; 
} 

// Inherit the Animal prototype 
Mammal.prototype = Object.create(Animal.prototype); 

// Set the Mammal constructor to 'Mammal' 
Mammal.prototype.constructor = Mammal; 

Mammal.prototype.getHasHair = function() { 
    return this.hasHair; 
} 

function Dog(name, breed) { 
    // Use the parent constructor and set the correct `this` 
    // Assume the dog has hair 
    Mammal.call(this, name, true); 

    this.breed = breed; 
} 

// Inherit the Mammal prototype 
Dog.prototype = Object.create(Mammal.prototype); 

// Set the Dog constructor to 'Dog' 
Dog.prototype.constructor = Dog; 

Dog.prototype.getBreed = function() { 
    return this.breed; 
} 

var fido = new Dog('Fido', 'Lab'); 

fido.getName(); // 'Fido' 
fido.getHasHair(); // true 
fido.getBreed(); // 'Lab' 

JavaScript OOP için iyi bir kaynaktır

Mozilla Developer Network

+0

Bu harika! Yorumlar takip etmeyi kolaylaştırır. Bazı takip sorularım var: "Mammal.prototype = Object.create (Animal.prototype);" "Mammal.prototype = new Animal()" ile aynı mı? Temel bilgilerimden bir yöntem olmadan Hayvan sınıfını oluşturdunuz ve ayrı ayrı Animal.prototype.getName oluşturdunuz. Bu, "iyi uygulama" olarak kabul edilir, çünkü üst sınıf, yeni bir Hayvan her oluşturulduğunda oluşturması gereken yöntemlerle "kirletmez". Bu doğru mu? Tek düşündüğüm, "iyi uygulama" olduğunu ve bunun neden tam olarak olduğunu anlamıyorum. Teşekkür ederiz. – sjmartin

+1

Object.create'i kullanmak, Animal kurucusunu çağırmadan verilen prototip temel alınarak bir nesne oluşturduğundan tercih edilir. Mirasını tanımlarken, Memeli ve Köpeğin Hayvansal'ın kurucusuna geçecek bir ismi yoktur. Yaptığım gibi yapıcıda ana yapıcıyı çağırmak, parametreleri geçmene izin verir. Ve sen haklısın. Yöntemleri, prototip yerine Animal sınıfında ayarlarsanız, her bir işlev için bu işlevin yeni bir kopyası oluşturulur. Bunun yerine prototip üzerinde bulunuyorsa, Animal yönteminin bir kopyasına sahip olmaz, ancak prototipi kontrol etmeyi bilir. – DevShep

İlgili konular