2012-07-26 14 views
5

Poniższy kod jest prawie identyczny z kodem z doskonałej książki Douglasa Crockforda JavaScript: The Good Parts, ze strony 29-30. Jedyną różnicą jest to, że dodaje właściwość get_status tak:Kod Crockforda dotyczący wzorca wywoływania konstruktora

Quo.prototype.get_status=function() { 
    this.status=string; 
} 

Moje pytanie brzmi, dlaczego jego kod działa OK, ale moja mała zmiana, poniżej wyniki w błędzie myQuo ma metodę get_status?

<script> 
    var Quo=function(string) { 
    this.status=string; 
    } 
    Quo.get_status=function() { 
    return this.status; 
    } 
    var myQuo=new Quo("confused"); 
    alert(myQuo.get_status()); 
</script> 

Odpowiedz

8

Ty dodanie metody do obiektu Quo funkcji, a nie jej prototyp, więc nie będą dziedziczone przez instancje stworzone z new Quo(). Funkcja dodana w ten sposób jest trochę jak statyczna metoda w klasycznych językach OOP - może być wywołana z Quo.get_status(), ale nie będzie dziedziczona przez instancje, a this będzie odwoływać się do samej funkcji Quo.

Quo.status = "foo"; 
Quo.get_status(); // "foo" 
+1

Pytanie to _why_ get_status nie jest dodawane do myQuo. Wiem już, że dodałem go do Quo, a nie do jego prototypu. –

+5

Instancje nie dziedziczą właściwości ani metod ich konstruktorów - dziedziczone są tylko właściwości i metody dołączone do prototypu. – nrabinowitz

0

Funkcje to obiekty w JavaScript. Gdy dodajesz właściwości do funkcji, nie są one dziedziczone przez instancje tej funkcji. Jednak po dodaniu właściwości do prototypu funkcji są one dziedziczone. Aby zrozumieć, jak dziedziczenie oparte na prototypach działa w JavaScript, przeczytaj following answer.

Powiązane problemy