🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.javascript
20 messages
20 total messages Started by mmiarecka Sat, 11 Jul 2009 20:19
obiektowosc w js - pytanie o dziedziczenie
#49140
Author: mmiarecka
Date: Sat, 11 Jul 2009 20:19
32 lines
1971 bytes
Mam klase bazowa:

function Bazowa() {
  this.getName() {
    return "bazowa.getName";
  }

  this.display(obj) {
    alert(obj.getName);
  }
}

i klase pochodna:

function Pochodna() {
  function Pochodna() {
    Bazowa.call(this);
  }
  this.getName() {
    return "pochodna.getName";
  }
}

Wydawalo mi sie, ze metoda display klasy Bazowa powinna byc widoczna z
poziomu klasy Pochodna, ale tak nie jest. Nie pomaga prototypowanie.
Dopoki w klasie Pochodna nie wkleje identycznego kodu metody display
jak w Bazowa wywolanie objPochodna.display() zwraca blad 'display is
not a function'. Wolalabym uniknac powielania tego samego kodu we
wszystkich klasach dziedziczacych...

Bede wdzieczna za sugestie oraz ewentualne wytlumaczenie, w ktorym
miejscu popelniam blad.
Re: obiektowosc w js - pytanie o dziedziczenie
#49141
Author: mmiarecka
Date: Sun, 12 Jul 2009 10:00
13 lines
1834 bytes
Zadanie rozwiazalam :) Jednak przespanie sie z problemem czyni cuda.
Przede wszystkim popelnilam czeski blad, dwa razy mialam zdefiniowana
klase Pochodna, wiec blad, ze metoda nie jest funkcja byl jak
najbardziej na miejscu :)

Znalazlam tez dwa sposoby na dziedziczenie:
- prototypowanie, gdzie obiektKlasyPochodnej instanceof KlasaBazowa
zwraca true;
- wykorzystanie inheritFrom - co prawda mam dostep do wszystkich metod
KlasyBazowej, ale instanceof zwraca mi false...

Za wszelkie komentarze zwiazane z obiektowoscia w js bede nieustajaco
wdzieczna :)
Re: obiektowosc w js - pytanie o dziedziczenie
#49142
Author: marcoos
Date: Sun, 12 Jul 2009 17:43
55 lines
2947 bytes
On 12 Lip, 12:00, mmiarecka <mmiare...@gmail.com> wrote:
> Za wszelkie komentarze zwiazane z obiektowoscia w js bede nieustajaco
> wdzieczna :)

Po pierwsze, w JS nie ma czegoś takiego jak "klasa". Mechnizmem
zapewniającym dziedziczenie są tutaj prototypy. Słowo "klasa" należy
brać w cudzysłów i rozumieć przez nie "zbiór obiektów o wspólnym
prototypie".

Po drugie, dziedziczenie realizuje się ustawiając prototyp
konstruktora obiektu pochodnego na instancję bazowego.

function Bazowa() {
// ...
}

function Pochodna() {
// ...
}
Pochodna.prototype = new Bazowa(); // tutaj :)

Po trzecie, publiczne funkcje obiektu, które nie potrzebują dostępu do
zmiennych w zasięgu konstruktora dodaje się do prototypu:

Pochodna.prototype.getName = function () {
// ...
}

w przeciwnym wypadku każdy obiekt ma swoją osobną kopię tej funkcji,
marnując pamięć.

Operator instanceof działa tylko na obiektach mających właściwy
łańcuch prototypów. Wywoływanie JakisKonstruktor.call(this) takiego
łańcucha nie buduje.

Po czwarte, nie ma w języku czegoś takiego jak inheritFrom.
Najwyraźniej korzystasz z jakiejś biblioteki.

Po piąte, podany przez Ciebie kod nie ma prawa nawet się uruchomić
(błędy składniowe). :)

Po szóste:

function Pochodna() {
  function Pochodna() {
  // ...
  }
}

Wewnętrzna funkcja Pochodna jest widoczna tylko w zasięgu nadrzędnej
funkcji o tej samej nazwie, co za tym idzie, nie byłaby w ogóle
używana, nawet, jeśli poprawiłabyś czysto formalne błędy składniowe.

--
marcoos.com
Re: obiektowosc w js - pytanie o dziedziczenie
#49143
Author: mmiarecka
Date: Wed, 15 Jul 2009 08:43
30 lines
2719 bytes
On 12 Lip, 19:43, marcoos <marek.step...@gmail.com> wrote:
[...]
> Po trzecie, publiczne funkcje obiektu, które nie potrzebują dostępu do
> zmiennych w zasięgu konstruktora dodaje się do prototypu:
> w przeciwnym wypadku każdy obiekt ma swoją osobną kopię tej funkcji,
> marnując pamięć.

To bardzo cenna uwaga, dziekuje.

> Po czwarte, nie ma w języku czegoś takiego jak inheritFrom.
> Najwyraźniej korzystasz z jakiejś biblioteki.

I tu mnie zastrzeliles... Takie rozwiazanie podpowiedzial mi
eclipse... nie importuje zadnej biblioteki... No nic bede musiala
poszukac.

> Wewnętrzna funkcja Pochodna jest widoczna tylko w zasięgu nadrzędnej
> funkcji o tej samej nazwie, co za tym idzie, nie byłaby w ogóle
> używana, nawet, jeśli poprawiłabyś czysto formalne błędy składniowe.

No wlasnie i tu pojawia sie problem. Takie rozwiazanie, jak
umieszczanie zmiennych prywatnych/protected i metod prywatnych/
protected znalazlam w necie: http://www.crockford.com/javascript/private.html
Jednak mimo najszczerszych checi chyba jednak nie rozumiem o co
biega... chyba ze ja zle rozumiem slowo 'constructor'.

To jak po ludzku zaimplementowac prywatne i protected zmienne i
metody?

Jeszcze raz dziekuje za cenne wskazowki.
Re: obiektowosc w js - pytanie o dziedziczenie
#49144
Author: marcoos
Date: Wed, 15 Jul 2009 11:59
56 lines
3262 bytes
On 15 Lip, 10:43, mmiarecka <mmiare...@gmail.com> wrote:
> To jak po ludzku zaimplementowac prywatne i protected zmienne i
> metody?

Tak naprawdę należy zapomnieć o próbowaniu przenoszenia pojęć Javy do
JS - jest to podejście dość sztuczne i nieco na siłę - i pamiętać
tylko, że zmienne są widoczne tylko w tym zasięgu, w którym zostały
zadeklarowane i w zasięgach potomnych. JS jest językiem totalnie
odmiennym od Javy, jedyne co ma wspólnego, to podobna składnia
odziedziczona po C, ale paradygmaty są zupełnie inne. Poniżej przykład
takiego "na siłę" podejścia...

Jedynym sposobem hermetyzacji w JS są closures, czyli zasięgi funkcji,
za pomocą których można symulować (nie do końca) zachowanie języków w
rodzaju Javy.

var MojeCos = (function () {
  var a; // cos w rodzaju "private static"

  function MojeCos(a1, b, c) { // a1, b, c - argumenty konstruktora
(jednoczesnie zmienne lokalne zasięgu MojeCos)
    var d = 7; // zmienna lokalna zasięgu MojeCos

    this.b = b; // publiczne b
    a = a1;  // zmiana "prywatnego statycznego" a

    this.doSth = function() { // publiczna metoda zdefiniowana w
konstruktorze, Crockford nazywa to "priviledged"
       alert(a1 + ", " + b + ", " + c + ", " + d); // ma dostęp do a1,
b, c i d dzięki closure
    }

  }

  MojeCos.x = 8; // cos jak "public static"

  MojeCos.prototype.doSthElse() { // publiczna metoda prototypu
    alert(a); // ma dostep do "private static"
    alert(this.b); // ma dostep do publicznych
    // alert(c) - nie zadziala, nie ma dostepu, c jest w innym zasiegu
  };

  return MojeCos;
}());

var mc = new MojeCos();
mc.doSth();
mc.doSthElse();
alert(mc.b);
alert(MojeCos.x);

Kod z głowy, nie testowany - jeśli się gdzieś nie pomyliłem, to
powinien działać. :)

--
marcoos.com
Re: obiektowosc w js - pytanie o dziedziczenie
#49145
Author: William Bonawentura
Date: Thu, 16 Jul 2009 05:44
6 lines
1533 bytes
Użytkownik "marcoos" <marek.stepien@gmail.com> napisał w wiadomości 
news:5be0104f-8a8c-4001-8154-d8345db1e0e8@h18g2000yqj.googlegroups.com...
> Jedynym sposobem hermetyzacji w JS są closures, czyli zasięgi funkcji,

Jesteś absolutnie pewnym ? :) 
Re: obiektowosc w js - pytanie o dziedziczenie
#49151
Author: mmiarecka
Date: Thu, 16 Jul 2009 07:36
46 lines
2562 bytes
On 12 Lip, 19:43, marcoos <marek.step...@gmail.com> wrote:
[...]
> Po czwarte, nie ma w języku czegoś takiego jak inheritFrom.
> Najwyraźniej korzystasz z jakiejś biblioteki.

No dobra... to ja mam taki kod, ktory dziala bezblednie. Nie udalo mi
sie przetestowac na ie (bo go nie mam), ale na ff dziala bez
zarzutu... Nie dolaczam zadnych plikow js, wiec kod nie korzysta z
dodatkowych bibliotek...

function Node() {
	this.getNazwa = function() {
		return "Node.getNazwa";
	};

	this.dodaj = function(nodeObj) {
		alert(nodeObj.getNazwa());
	};
}

function Kategoria() {
	this.inheritFrom = Node;
	this.inheritFrom();

	this.getNazwa = function() {
		return "Kategoria.getNazwa";
	};

}

wywoluje tak:

var kat1 = new Kategoria();
var kat2 = new Kategoria();

kat1.dodaj(kat2); // dostaje alerta z 'Kategoria.getNazwa'

var node1 = new Node();
var node2 = new Node();

node1.dodaj(node2); // dostaje alerta z 'Node.getNazwa'

Bede wdzieczna za info, jesli to nie jest czesc jezyka js, to jakim
cudem dziala? Dodam ze korzystalam ze wskazowek zawartych na tej
stronie:
http://www.webreference.com/js/column79/3.html
Re: obiektowosc w js - pytanie o dziedziczenie
#49156
Author: Paweł Piskorz
Date: Thu, 16 Jul 2009 10:21
20 lines
1526 bytes
mmiarecka pisze:
> function Kategoria() {
> 	this.inheritFrom = Node;
> 	this.inheritFrom();

this.sratatata = Node;
this.sratatata();
Też zadziała ;)

> 	this.getNazwa = function() {
> 		return "Kategoria.getNazwa";
> 	};
> 
> }


-- 
message[autor="PablO"]::after {
	content:"Pozdrawiam";
}
Re: obiektowosc w js - pytanie o dziedziczenie
#49157
Author: mmiarecka
Date: Thu, 16 Jul 2009 10:31
10 lines
1857 bytes
On 16 Lip, 12:21, Paweł Piskorz <nie.ma.ma...@psikre.nie?> wrote:
> this.sratatata = Node;
> this.sratatata();
> Też zadziała ;)

lol... faktycznie :P

No dobra... ktos sie pokusi o wytlumaczenie mi ki diabel? W Javie
takie hocki nie dzialaja :/ Ja wiem, ze JavaScript to nie Java, ale
nie mam innego punktu oparcia jesli chodzi o obiektowosc...
Re: obiektowosc w js - pytanie o dziedziczenie
#49152
Author: marcoos
Date: Thu, 16 Jul 2009 11:02
10 lines
1929 bytes
On 16 Lip, 09:36, mmiarecka <mmiare...@gmail.com> wrote:
> Bede wdzieczna za info, jesli to nie jest czesc jezyka js, to jakim
> cudem dziala? Dodam ze korzystalam ze wskazowek zawartych na tej
> stronie:http://www.webreference.com/js/column79/3.html

Paweł już Ci to wyjaśnił, ja natomiast jeszcze zwracam uwagę na to, że
przesłaniasz (o ile to kod dla przeglądarki) wbudowany obiekt Node.

--
marcoos.com
Re: obiektowosc w js - pytanie o dziedziczenie
#49153
Author: mmiarecka
Date: Thu, 16 Jul 2009 11:25
13 lines
2126 bytes
On 16 Lip, 13:02, marcoos <marek.step...@gmail.com> wrote:
[...]
> ja natomiast jeszcze zwracam uwagę na to, że
> przesłaniasz (o ile to kod dla przeglądarki) wbudowany obiekt Node.

Wiem, wiem :)

Natomiast ciagle mam problem z ogarnieciem modyfikatorow dostepu...
Jedno z przykladowych zadan, ktore znalazlam w necie:
"zaimplementuj mi klase X, ktora dziedziczy po Y, ktora ma properties
prywatna Z i protected V". O ile z dziedziczeniem i prywatnymi
wlasciwosciami nie mam wiekszego problemu o tyle protected zaczyna mi
sie snic po nocach w roli koszmaru...
Re: obiektowosc w js - pytanie o dziedziczenie
#49154
Author: marcoos
Date: Thu, 16 Jul 2009 17:53
30 lines
2999 bytes
On 16 Lip, 13:25, mmiarecka <mmiare...@gmail.com> wrote:
> Natomiast ciagle mam problem z ogarnieciem modyfikatorow dostepu...

A to jest bardzo proste: nie ma żadnych "modyfikatorów dostępu". :)

> Jedno z przykladowych zadan, ktore znalazlam w necie:
> "zaimplementuj mi klase X, ktora dziedziczy po Y, ktora ma properties
> prywatna Z i protected V". O ile z dziedziczeniem i prywatnymi
> wlasciwosciami nie mam wiekszego problemu o tyle protected zaczyna mi
> sie snic po nocach w roli koszmaru...

Nie ma klas w JavaScripcie, ani nie ma pól o dostępie "protected" (ani
niczego specjalnie podobnego). Samo sformułowanie takiego zadania,
jeśli dotyczy JS, świadczy o tym, że jego autor nie ma pojęcia, o co
chodzi. :)

W JS nie ma także zmiennych prywatnych. To, co dla uproszczenia (czy
zagmatwania, jak tutaj) nazywa się "zmiennymi prywatnymi" jakiejś
"klasy", to zwykłe zmienne lokalne jakiejś funkcji, na przykład
konstruktora. Można by też przeprowadzić akademicką dyskusję na temat,
czy to, co nazywamy "zmiennymi publicznymi" w JS spełnia definicję
zmiennej publicznej takiej jak w C++ czy Javie. :)

Tak jak napisałem - jedyną hermetyzacją w JS są zasięgi funkcji
(closures). Przy ich pomocy można do pewnego stopnia imitować zmienne
"prywatne" przy dzięki temu, jak zachowują się zmienne lokalne
funkcji.

--
marcoos.com
Re: obiektowosc w js - pytanie o dziedziczenie
#49146
Author: marcoos
Date: Thu, 16 Jul 2009 17:55
8 lines
1713 bytes
On 16 Lip, 07:44, "William Bonawentura" <n...@ipartners.pl> wrote:
> > Jedynym sposobem hermetyzacji w JS są closures, czyli zasięgi funkcji,
> Jesteś absolutnie pewnym ? :)

A masz kontrprzykład? Nie sądzę. :)

--
marcoos.com
Re: obiektowosc w js - pytanie o dziedziczenie
#49158
Author: marcoos
Date: Thu, 16 Jul 2009 18:14
58 lines
3755 bytes
On 16 Lip, 09:36, mmiarecka <mmiare...@gmail.com> wrote:
> Bede wdzieczna za info, jesli to nie jest czesc jezyka js, to jakim
> cudem dziala? Dodam ze korzystalam ze wskazowek zawartych na tej
> stronie:http://www.webreference.com/js/column79/3.html

Wcale nie działa. Owszem, coś tam robi, ale nie to, czego tak naprawdę
chcesz. :)

function Kategoria() {
         this.inheritFrom = Node;
         this.inheritFrom();
}

Co tu zostało zrobione: funkcja-konstruktor o (nieszczęśliwej,
konfliktogennej) nazwie "Node" została przypisana do tworzonego
obiektu pod dziwną i niepasującą nazwą "inheritFrom" i zaraz potem
wywołana. Dzięki temu wprawdzie "this" w tak wywołanej funkcji Node
wskazuje na właściwy obiekt (ten sam this, co wewnątrz konstruktora
Kategoria), ale nie zostanie zachowana hierarchia prototypów.

k = new Kategoria();
alert(k instanceof Node); // false

Ponadto to całe "inheritFrom" wykonuje się (zupełnie niepotrzebnie)
przy każdej instancjacji konstruktora Kategoria. Nie ma to sensu -
szkoda czasu i pamięci.

Dlatego prawidłowo powinno być:

function Kategoria() {
        // zakładam, że ma to być funkcja "priviledged"; jeśli nie,
        //to powinna być zdefiniowana w prototypie
        this.getNazwa = function() {
                return "Kategoria.getNazwa";
        };
}
Kategoria.prototype = new Node();

W ten sposób prototyp Kategorii jest instancją Node (i tylko raz
zostanie ona zinstancjowana do celów dziedziczenia w Kategorii), a
hierarchia prototypów zostanie zachowana:

k = new Kategoria();
alert(k instanceof Node); // true

Tak działa (pseudo-)klasyczne dziedziczenie w JS. Niektórzy piszą
sobie jakieś funkcje, które to upraszczają (metoda
Function.prototype.method proponowana przez Crockforda, kiedy jeszcze
nie był wrogiem udawania "klasowości" ;)), Prototype.js i inne
biblioteki dostarczają odpowiedni cukier składniowy, ale zasada jest
ta sama.

Inna sprawa, że można sobie całkowicie poradzić (prawie) bez
konstruktorów i operatora new, odchodząc od udawania Javy. Zob.
http://javascript.crockford.com/prototypal.html :)

--
marcoos.com
Re: obiektowosc w js - pytanie o dziedziczenie
#49147
Author: William Bonawentura
Date: Fri, 17 Jul 2009 07:31
12 lines
1851 bytes
Użytkownik "marcoos" <marek.stepien@gmail.com> napisał w wiadomości 
news:eb247ef3-ba6f-4d85-ab8b-8c8a84181620@o7g2000yqb.googlegroups.com...
On 16 Lip, 07:44, "William Bonawentura" <n...@ipartners.pl> wrote:
> > Jedynym sposobem hermetyzacji w JS są closures, czyli zasięgi funkcji,
> Jesteś absolutnie pewnym ? :)

A masz kontrprzykład? Nie sądzę. :)


Np. konwencja nazewnicza. Albo kontrola "isinstance" dla this wewnątrz 
chronionej metody. 
Re: obiektowosc w js - pytanie o dziedziczenie
#49159
Author: mmiarecka
Date: Fri, 17 Jul 2009 07:50
9 lines
1795 bytes
On 16 Lip, 20:14, marcoos <marek.step...@gmail.com> wrote:
> Wcale nie działa. Owszem, coś tam robi, ale nie to, czego tak naprawdę
> chcesz. :)

Do tego juz w miedzy czasie doszlam sama :) ale i tak dziekuje za
opisanie slowami tego, co gdzies tam pod skora czulam :)

Ciezko sie walczy z JS majac nalecialosci z Javy... To dwa rozne
swiaty.
Re: obiektowosc w js - pytanie o dziedziczenie
#49155
Author: mmiarecka
Date: Fri, 17 Jul 2009 07:54
40 lines
3562 bytes
On 16 Lip, 19:53, marcoos <marek.step...@gmail.com> wrote:
> On 16 Lip, 13:25, mmiarecka <mmiare...@gmail.com> wrote:
>
> > Natomiast ciagle mam problem z ogarnieciem modyfikatorow dostepu...
>
> A to jest bardzo proste: nie ma żadnych "modyfikatorów dostępu". :)
>
> > Jedno z przykladowych zadan, ktore znalazlam w necie:
> > "zaimplementuj mi klase X, ktora dziedziczy po Y, ktora ma properties
> > prywatna Z i protected V". O ile z dziedziczeniem i prywatnymi
> > wlasciwosciami nie mam wiekszego problemu o tyle protected zaczyna mi
> > sie snic po nocach w roli koszmaru...
>
> Nie ma klas w JavaScripcie, ani nie ma pól o dostępie "protected" (ani
> niczego specjalnie podobnego). Samo sformułowanie takiego zadania,
> jeśli dotyczy JS, świadczy o tym, że jego autor nie ma pojęcia, o co
> chodzi. :)

Powiem tak - tez mi sie tak wydaje, ale ja jestem ciagle zielona w js
wykraczajacym poza operowanie na strukturze DOM. Zadanie, ktore
przytoczylam dostalam od rekrutera jak przyklad tego co mnie czeka na
tescie rekrutacyjnym...

> W JS nie ma także zmiennych prywatnych. To, co dla uproszczenia (czy
> zagmatwania, jak tutaj) nazywa się "zmiennymi prywatnymi" jakiejś
> "klasy", to zwykłe zmienne lokalne jakiejś funkcji, na przykład
> konstruktora. Można by też przeprowadzić akademicką dyskusję na temat,
> czy to, co nazywamy "zmiennymi publicznymi" w JS spełnia definicję
> zmiennej publicznej takiej jak w C++ czy Javie. :)
>
> Tak jak napisałem - jedyną hermetyzacją w JS są zasięgi funkcji
> (closures). Przy ich pomocy można do pewnego stopnia imitować zmienne
> "prywatne" przy dzięki temu, jak zachowują się zmienne lokalne
> funkcji.

To juz opanowalam, umiem swobodnie zbudowac lancuch dziedziczenia, z
uzyciem wlasciwosci "publicznych" i "prywatnych". Teraz pozostaje mi
przekonanie rekrutera :P

Dziekuje marcoos, Twoje wypowiedzi bardzo duzo mi daly.
Re: obiektowosc w js - pytanie o dziedziczenie
#49148
Author: marcoos
Date: Fri, 17 Jul 2009 09:56
22 lines
2357 bytes
On 17 Lip, 09:31, "William Bonawentura" <n...@ipartners.pl> wrote:
> > > Jedynym sposobem hermetyzacji w JS są closures, czyli zasięgi funkcji,
> > Jesteś absolutnie pewnym ? :)
>
> A masz kontrprzykład? Nie sądzę. :)
>
> Np. konwencja nazewnicza.

Konwencja nazewnicza jest tylko konwencją. Owszem, często jest to
najlepsze i najprostsze rozwiązanie, ale nikt nie broni złamać
konwencji
i pisać do "prywatnych" własności z podkreśleniem w nazwie. :)

> Albo kontrola "isinstance" dla this wewnątrz chronionej metody.

isinstance brzmi jak Python, miałeś chyba na myśli instanceof. :)

Nie nazwałbym tego jednak hermetyzacją - metoda dalej jest dostępna,
tylko zmieniasz jej zachowanie.:)

--
marcoos.com
Re: obiektowosc w js - pytanie o dziedziczenie
#49149
Author: William Bonawentura
Date: Fri, 17 Jul 2009 11:38
11 lines
2096 bytes
Użytkownik "marcoos" <marek.stepien@gmail.com> napisał w wiadomości 
news:3ff4d8a4-6862-4933-aedd-a7c3f58ba854@b14g2000yqd.googlegroups.com...
> Konwencja nazewnicza jest tylko konwencją. Owszem, często jest to
> najlepsze i najprostsze rozwiązanie, ale nikt nie broni złamać
> konwencji
> i pisać do "prywatnych" własności z podkreśleniem w nazwie. :)

Reguła dla kompilatora też jest tylko konwencją - nie pozwala na defaultowe 
skompilowanie kodu z takim odwołaniem. Kto chce wykona metodę "hackiem". W 
technice closures też możesz odczytać źródło funkcji i wykonać ją evalem.
Re: obiektowosc w js - pytanie o dziedziczenie
#49150
Author: marcoos
Date: Fri, 17 Jul 2009 13:26
9 lines
2283 bytes
On 17 Lip, 13:38, "William Bonawentura" <n...@ipartners.pl> wrote:
> Reguła dla kompilatora też jest tylko konwencją - nie pozwala na defaultowe
> skompilowanie kodu z takim odwołaniem. Kto chce wykona metodę "hackiem". W
> technice closures też możesz odczytać źródło funkcji i wykonać ją evalem.

Nie będzie to możliwe w ECMAScripcie 5 z dyrektywą "use strict".

--
marcoos.com
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads