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();
Musisz przeczytać, aby zrozumieć dziedziczenie w JS: http://javascript.crockford.com/inheritance.html i http://javascript.crockford.com/prototypal.html – bfavaretto
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. –
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