/*
* Problem polega na tym, że nie można do funkcji wysłać referencji metody dziedziczonej obiektu bez uprzedniego wiązania
* jej w jakiś sposób z bieżącym kontekstem lub kontekstem prototypu bieżącego obiektu.
* Jedynym rozwiązaniem jest utworzenie nowej funkcji ze związanym kontekstem
* i przypisanie jej do pola bieżącego obiektu - wykonane w punkcie (1) co wiąże się
* z marnowaniem pamięci, lub użycie prototypu bieżącego obiektu i przypisanie metody ze związanym
* kontekstem do właściwego pola (2), co nie jest rozwiązaniem prawidłowym ze względu na złe umieszczenie
* metody w łańcuchu dziedziczenia.
* Jest to poważny problem ponieważ przez to niemożliwe jest pełne programowanie
* wieloparadygmatowe JS (funkcyjne i obiektowe).
* Na marginesie: nawet w C++, który nie jest uznawany za język z programowaniem funkcyjnym
* jest to możliwe.
*/
function wykonajInna(funkcja) {
funkcja();
}
// Zwierze
function Zwierze() {
this.iloscDzieci = 0;
}
Zwierze.prototype = new Object();
Zwierze.prototype.rozmnoz = function() {
console.log("Rozmnazanie");
this.iloscDzieci += 1;
}
// Kurczak
function Kurczak() {
this.jajka = 5;
}
Kurczak.prototype = new Zwierze();
var kurczak = new Kurczak();
function wykonajTest() {
console.log("---------------------------------------------")
console.log("wykonajInna(kurczak.glos)")
console.log("kurczak ma: " + kurczak.iloscDzieci + " dzieci");
wykonajInna(kurczak.rozmnoz);
console.log("kurczak ma: " + kurczak.iloscDzieci + " dzieci");
console.log("---------------------------------------------")
console.log("kurczak.rozmnoz()")
console.log("kurczak ma: " + kurczak.iloscDzieci + " dzieci");
kurczak.rozmnoz();
console.log("kurczak ma: " + kurczak.iloscDzieci + " dzieci");
}
// Klient
// Pierwsze wykonanie testu, bez przypisywania metody do kontekstu bieżącego obiektu
console.log("Test pierwszy - bez zmiany kontekstu ===========================");
wykonajTest();
// Przypisanie metody do kontekstu obiektu i wykonanie testu - wynik prawidłowy ale
// kurczak i każdy obiekt, typu Kurczak muszą mieć przypisaną właściwość - funkcję do
// kontekstu, co wiąże sie z marnotrastwem pamięci.
console.log("Test - funkcja związana z kontekstem ==============================");
var kurczakRozmnoz = kurczak.rozmnoz; // Zapisanie zmiennej na czas testu, żeby przywrócić później
kurczak.rozmnoz = kurczak.rozmnoz.bind(kurczak); // (1) trzeba powtorzyć dla każdego kurczaka
wykonajTest();
kurczak.rozmnoz = kurczakRozmnoz;
// Alternatywnie można użyć kontekstu bieżącego prototypu. Ale znów nie jest to idealne.
console.log("Test pierwszy - kontekst prototypu ===========================");
Kurczak.prototype.rozmnoz = Zwierze.prototype.rozmnoz.bind(Kurczak.prototype); // (2) rozmnoz w prototypie Kurczaka zamiast Zwierzęcia.
wykonajTest()
Poza tym, chyba każdy widzi jak niepotrzebnie zawiły jest ten język.
Ten post edytował lukasz1985 1.12.2013, 16:04:39