Programowanie zorientowane na prototypy

Programowanie zorientowane prototyp jest formą programowania obiektowego bez klas, w oparciu o koncepcję prototypu. Prototyp to obiekt, z którego tworzone są nowe obiekty. W języku programowania zorientowanym na prototypy Self właściwości obiektu, niezależnie od tego, czy odnoszą się do atrybutów, czy do metod, nazywane są szczelinami  ; nie ma takiego samego rozróżnienia między gniazdami danych i gniazdami kodu, które mamy w przypadku klas. Duża różnica w programowaniu typu obiekt-klasa polega na tym, że można zastąpić zawartość gniazd, dodać więcej lub zmienić hierarchię dziedziczenia, niezależnie od tego, czy jest ona dostarczona w oryginalnym obiekcie, czy nie.

Jaźń była pierwszym językiem prototypowym. Został zaprojektowany w laboratoriach Sun w latach 90 . Najbardziej znanym obecnie jest JavaScript .

Porównanie modeli klasowych i prototypowych

Obiekty klasowe:

Obiekty prototypowe:

Zainteresowanie programowaniem zorientowanym na prototypy

Jednym z głównych zainteresowań prototypów jest dynamiczne dziedziczenie: każdy obiekt może zmienić rodzica w czasie wykonywania, w dowolnym momencie.

Możemy zmaterializować paradygmaty obiekt-prototyp i obiekt-klasa, zauważając różnicę w wykorzystaniu pamięci.

Obecnie istnieje kilka języków opartych na obiektach prototypowych: Self , Lisaac lub języki implementujące specyfikację ECMAScript ( JavaScript , ActionScript , JScript ). Self i JavaScript to języki dynamicznie typowane i są interpretowane. Lisaac i ActionScript są statycznie wpisywane i kompilowane. W języku ActionScript 3.0 dziedziczenie prototypów nie jest głównym mechanizmem dziedziczenia, ponieważ ta rola dotyczy również dziedziczenia klas, które jest obecnie obecne w tej wersji.

Przykład: dziedziczenie w JavaScript

Właściwości obiektów są wyszukiwane w łańcuchu dziedziczenia w taki sam sposób, jak wartości zmiennych w stosie kontekstów wykonania.

Pismo jest foo.barinterpretowane w następujący sposób:

  1. Nazwa foojest poszukiwana na liście identyfikatorów zadeklarowanych w kontekście bieżącego wywołania funkcji (zadeklarowanej przez varlub przez parametry funkcji).
  2. Jeśli nie zostanie znaleziony:
    • Wyszukiwanie jest kontynuowane (z powrotem do kroku 1) w kontekście wywołania wyższego poziomu (jeśli istnieje).
    • W przeciwnym razie zostanie osiągnięty kontekst globalny i wyszukiwanie zakończy się błędem odwołania.
  3. Jeśli wartość skojarzona z foonie jest obiektem, nie ma właściwości, a wyszukiwanie kończy się błędem odwołania.
  4. Właściwość barjest najpierw szukana w samym obiekcie.
  5. Jeśli nieruchomości nie ma:
    • Poszukiwanie jest kontynuowane (powrót do kroku 4) w prototypie tego obiektu (jeśli istnieje).
    • Jeśli obiekt nie ma skojarzonego prototypu, zwracana undefinedjest niezdefiniowana wartość ( ).
  6. W przeciwnym razie właściwość została znaleziona i zwracane jest jej odwołanie.

Nie jest to statyczna kopia zmiennej; za każdym razem, gdy kompilator (interpreter) napotka identyfikator, interpretuje go zgodnie z opisem.

Ponieważ właściwość zadeklarowana w obiekcie jest znaleziona jako pierwsza, ukrywa te o tej samej nazwie, które mogły istnieć w prototypach, które dziedziczy obiekt. Na przykład prototyp obiektu Objectma metodę, toStringktóra zwraca opis obiektu dla dowolnego typu obiektu. Obiekty utworzone przez Date()dziedziczą prototyp tej funkcji, w tym metodę toStringzwracającą bardziej przydatne informacje; Ten sposób ukrywa toStringsię Object.prototype.

Obiekt dziedziczy prototyp po swoim konstruktorze. Jeśli nie używasz konstruktora do inicjalizacji obiektu, możesz użyć pustej funkcji, aby utworzyć to łącze.

var A = {}; // identique à « var A = new Object(); » var B = (function () { function F() {} F.prototype = A; return new F(); }()); // depuis JavaScript 1.8.5 la méthode « Object.create(A); » a le même effet // à présent A est dans la chaîne de recherche d'identifiants de B A.compte = 0; A.separ = ": "; B.separ = ", "; for (A.compte = 0; A.compte < 10; A.compte++) { document.write(B.compte + B.separ) // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }

Ten przykład pokazuje dziedziczenie właściwości, która zwraca wartość typu liczba; dziedziczenie odwołań do obiektu, w tym metody, odbywa się w ten sam sposób.

Języki

Zobacz też

Linki zewnętrzne