2012-01-30 10 views
6

Spójrz na poniższy kod:Dziedziczenie JavaScript: kiedy moi drodzy członkowie?

function Primate() { 
    this.prototype = Object; 
    this.prototype.hairy = true; 
} 

function Human() { 
    this.prototype = Primate; 
} 

new Human(); 

Podczas inspekcji new Human(), nie ma hairy członkiem. Spodziewałbym się, że taki będzie. Czy istnieje inny sposób, który powinien odziedziczyć po Primate? Coś związanego z Object.create() (ECMAScript5 można użyć w moim scenariuszu)?

+0

Musisz przeczytać, aby zrozumieć dziedziczenie w JS: http://javascript.crockford.com/inheritance.html i http://javascript.crockford.com/prototypal.html – bfavaretto

+1

Robisz to źle. Chcesz manipulować 'prototypowymi' obiektami konstruktorów - 'Prymasem' i' Człowiekiem'. Nowo utworzona instancja (wartość 'this' wewnątrz konstruktora) jest * nie * funkcją i dlatego dodanie właściwości' prototype' jest bezsensowne. –

+0

Chciałbym tworzyć i rozszerzać obiekty (z Object.create) zamiast małpy łatającej łańcuch prototypów. Używanie funkcji jako konstruktorów może prowadzić do nieporozumień, ponieważ implementuje obiekty JavaScript jako struktury klasopodobne. – rxgx

Odpowiedz

4

Podczas pisania kodu obiekty utworzone za pomocą new Human() będą miały właściwość o nazwie prototype, której wartość jest odniesieniem do funkcji Primate. To zdecydowanie nie jest to, czego chcesz (i nie jest szczególnie wyjątkowe).

kilka rzeczy:

  • Zazwyczaj chcemy zmodyfikować prototype o funkcji, który jest przewidziany do stosowania jako konstruktor (z operatorem new). Innymi słowy, chcesz ustawić prototype na Human (nie na instancji z Human).

  • Wartość przypisać do prototype powinny być instancja żądanego typu (lub, jeśli nie jest to konieczne prace inicjalizacji, żądany typ użytkownika prototype), a nie odniesienie do jego konstruktora.

  • Nigdy nie jest konieczne jednoznaczne przypisywanie instancji Object (lub Object) do funkcji prototype. To jest ukryte.

Prawdopodobnie chcesz coś bardziej jak to:

function Primate() { 
    this.hairy = true; 
} 

function Human() {} 
Human.prototype = new Primate(); 
Human.prototype.constructor = Human; 

var h = new Human(); 

Human odwołuje h ma właściwość o nazwie hairy którego wartość jest prawdą.

W poprzednim przykładzie, hairy przypisano jej wartość tylko raz Primate jest wywoływana, dlatego Human.prototype należy przypisać instancję Primate. Może to być napisane tak, że taka inicjalizacja nie jest konieczna.

Przykład:

function Primate() {} 
Primate.prototype.hairy = true; 

function Human() {} 
Human.prototype = Primate.prototype; 
Human.prototype.constructor = Human; 

var h = new Human(); 
Powiązane problemy