Pozwól nam mieć 2 konstruktorów
bird= function(name){
this.cry=function(){ alert("cry"); }
this.name=name;
}
duck= function(){
this.cry=function(){ alert("cry cry"); }
}
b= new bird("Ivan");
d= duck.call(b);
i rozważ prototypowe dziedziczenie
bird= function(name){
this.cry=function(){ alert("cry"); }
this.name=name;
}
duck= function(){
this.cry=function{ alert("cry cry"); }
}
duck.prototype= new bird("Ivan");
Czy można uzyskać przykłady, kiedy prototypowe dziedziczenie jest lepsze od zanieczyszczeń, a gdy zanieczyszczenia są lepsze od prototypowego dziedziczenia.
Odpowiedzi:
1 dla odpowiedzi № 1Nie powinieneś tworzyć instancji Parent, aby ustawić prototypową część dziedziczenia (użyj Child.prototype = Object.create (Parent.prototype), Child.prototype.constructor = Child).
Funkcje konstruktora powinny zaczynać się od Kapitału (wielka litera).
Możesz dziedziczyć przez wypychanie wszystkiego w funkcji konstruktora (pierwszy przykład) iw dziale Dziecko Parent.apply(this,arguments);
ale Dziecko nie będzie w stanie rozszerzyć funkcji nadrzędnych, a zajmie więcej procesora i pamięci, aby utworzyć wystąpienia dziecka i rodzica.
Sposób w jaki twój drugi przykład używa prototypuźle, ustawiasz wspólne zachowanie jako element instancji (funkcja płaczu) i specyficzny dla instancji element na prototypie Duck (członek nazwy). Jeśli chodzi o zalety korzystania z prototypu (jeśli wykonane poprawnie) w pierwszym przykładzie, który dostarczyłeś:
- Możesz ponownie użyć funkcji rodzicielskich w funkcji Dziecko i rozszerzyć je, jeśli chcesz
- Wykorzystuje mniej pamięci i mniej procesora do inicjowania wystąpień, ponieważ członkowie prototypów są udostępniani.
- Możesz dodać zachowanie prototypu po utworzeniu instancji i mieć wszystkie istniejące wystąpienia tego zachowania.
- Inni programiści JS lepiej zrozumieliby twój kod i myśleli, że wiesz, co robisz.
Więcej informacji na temat funkcji konstruktora i prototypu można znaleźć tutaj.