Co to znaczy, że Javascript jest językiem opartym na prototypach?

Jedną z głównych zalet Javascript jest to, że jest to język oparty na prototypach.

Ale co to znaczy, że Javascript jest oparty na prototypach i dlaczego jest to zaletą?

Author: Tom van der Woerdt, 2008-10-09

7 answers

Dziedziczenie prototypowe {[2] } jest formą zorientowanego obiektowo kodu reuse . Javascript jest jednym z niewielu [głównego nurtu] języków obiektowych, które używają dziedziczenia prototypowego. Prawie wszystkie inne języki obiektowe są klasyczne.

W klasycznym dziedziczeniu programista pisze klasę, która definiuje obiekt. Wiele obiektów może być utworzonych z tej samej klasy, więc masz kod w jednym miejscu, który opisuje kilka obiektów w twoim programie. Klasy mogą być następnie zorganizowane w hierarchię, co sprzyja ponownemu wykorzystaniu kodu. Bardziej ogólny kod jest przechowywany w klasie wyższego poziomu, z której dziedziczą klasy niższego poziomu. Oznacza to, że obiekt współdzieli kod z innymi obiektami tej samej klasy, a także ze swoimi klasami nadrzędnymi.

W postaci dziedziczenia prototypowego Obiekty dziedziczą bezpośrednio od innych obiektów. Cała sprawa z klasami odchodzi. Jeśli chcesz obiekt, po prostu napisz obiekt. Ale ponowne użycie kodu jest nadal cenną rzeczą, więc obiekty mogą być połączone ze sobą w hierarchii. W javascript każdy obiekt ma tajne łącze do obiektu, który go utworzył, tworząc łańcuch. Gdy obiekt zostanie poproszony o właściwość, której nie posiada, zostanie zapytany o jego obiekt nadrzędny... ciągle w górę łańcucha, aż właściwość zostanie znaleziona lub dopóki obiekt główny nie zostanie osiągnięty.

Każda funkcja w JavaScript (które są same w sobie obiektami) faktycznie ma element o nazwie " prototype", który jest odpowiedzialny za dostarczanie wartości, gdy obiekt jest o nie proszony. Posiadanie tego członu pozwala na działanie mechanizmu konstruktora (za pomocą którego obiekty są konstruowane z funkcji). Dodanie właściwości do prototypu obiektu funkcji sprawi, że będzie ona dostępna dla konstruowanego obiektu, jak również dla wszystkich obiektów, które z niego odziedziczą.

Zalety

Nie może być twardej i szybkiej reguły, dlaczego dziedziczenie prototypowe jest korzystną formą kod-ponowne użycie. Samo ponowne użycie kodu jest korzystne, a dziedziczenie prototypowe jest rozsądnym sposobem na to. Można by argumentować, że dziedziczenie prototypowe jest dość prostym modelem ponownego użycia kodu, a ten kod może być mocno ponownie użyty w bezpośredni sposób . Ale języki Klasyczne są z pewnością w stanie to osiągnąć.

Sidenote: @Andrew Hedges zwraca uwagę, że istnieje wiele języków prototypowych. Warto zauważając, że te inne istnieją, ale warto również zauważyć, że żaden z nich nie jest niczym zbliżonym do mainstreamu. Newtonsscript wydawało się mieć jakiś trakcji na chwilę, ale zmarł z jego platformy. Możliwe jest również rozszerzenie niektórych nowoczesnych języków w sposób, który dodaje możliwości prototypowe.

 260
Author: keparo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 06:18:03

Język oparty na prototypach, nie rozróżnia klas od obiektów: po prostu ma obiekty. Język oparty na prototypach ma pojęcie obiektu prototypowego, obiektu używanego jako szablon, z którego można uzyskać początkowe właściwości nowego obiektu. Każdy obiekt może określać własne właściwości, zarówno podczas jego tworzenia, jak i podczas wykonywania. Dodatkowo, każdy obiekt może być skojarzony jako prototyp dla innego obiektu , pozwalając drugiemu obiektowi współdzielić pierwszy obiekt właściwości.

 48
Author: Guido,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 07:26:18

Programowanie oparte na prototypach to styl programowania obiektowego, w którym klasy nie są obecne, a ponowne użycie (lub dziedziczenie w językach opartych na klasach) odbywa się poprzez klonowanie istniejących obiektów, które służą jako prototypy.

 29
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 07:27:12

Zaletą/wadą jest to, że możemy tworzyć nowe rodzaje obiektów w czasie działania bez potrzeby definiowania klas (statyczny kod). Podobnie jak większość funkcji jest upto deweloper, aby włączyć go do zalet/wad.

Powyżej jest możliwe, ponieważ obiekty są zasadniczo funkcjami w java script(zamknięcia też).

 10
Author: questzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 07:45:21

Zamiast deklarować strukturę klas, możesz tworzyć obiekty tego samego typu i dodawać do ich definicji w dowolnym momencie używając prototypu obiektu. Jest bardziej elastyczny niż normalny sposób robienia rzeczy.

 5
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 07:25:55

Jeśli po prostu używasz obiektów w czasie wykonywania zamiast klasy podczas kompilacji do budowania nowych obiektów, otwiera to możliwość rozszerzenia obiektu bez znajomości szczegółów na jego temat. Oczywiście, może stać się wadą dość szybko w zależności od użytkowania. Nie robię żadnych założeń co do języka tutaj, więc ma zastosowanie do języków innych niż javascript, które nie są tak dynamiczne.

myobject.prototype=unkownobject;
myobject.newproperty=1;

Możesz uzyskać obiekt z dowolnego miejsca; własny kod, z sieci, z bazy danych, z linkowania zewnętrznego i tak dalej.

Zauważ, że język nie musi implementować dziedziczenia prototypów, jak javascript. W javascript prototypowy obiekt jest jedynie współdzielony, podobnie jak jego właściwości, wśród dziedziców. Alternatywą jest skopiowanie wszystkich właściwości prototypu do nowego obiektu. Każde podejście ma swoje mocne strony w różnych sytuacjach. Lubię drugi bardziej, ale to nie jest to, co robi javascript.

 5
Author: artificialidiot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-09 08:14:09

Po przeczytaniu wszystkich odpowiedzi jest to wniosek

1) dziedziczenie, w którym obiekty są dziedziczone bezpośrednio z innych obiektów

2) który nie używa klas

3) zwane również programowaniem opartym na instancjach lub bezklasowym programowaniem zorientowanym na prototyp

4) ponowne użycie zachowania odbywa się poprzez klonowanie istniejących obiektów, które służą jako prototypy

5) obiekt używany jako szablon z nowego obiektu uzyskaj początkowe właściwości

 3
Author: Sunil Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 12:19:03