Jestem stosunkowo nowy w JavaScript i ciągle widzę .extend i .prototype w bibliotekach innych firm, których używam. Myślałem, że ma to coś wspólnego z biblioteką Prototype javascript, ale zaczynam myśleć, że tak nie jest. Do czego służą?
źródło
Jestem stosunkowo nowy w JavaScript i ciągle widzę .extend i .prototype w bibliotekach innych firm, których używam. Myślałem, że ma to coś wspólnego z biblioteką Prototype javascript, ale zaczynam myśleć, że tak nie jest. Do czego służą?
Dziedziczenie JavaScript jest oparte na prototypach, więc możesz rozszerzyć prototypy obiektów, takich jak Date, Math, a nawet własne.
Date.prototype.lol = function() {
alert('hi');
};
( new Date ).lol() // alert message
W powyższym fragmencie definiuję metodę dla wszystkich obiektów Date (już istniejących i wszystkich nowych).
extend
jest zwykle funkcją wysokiego poziomu, która kopiuje prototyp nowej podklasy, którą chcesz rozszerzyć z klasy bazowej.
Możesz więc zrobić coś takiego:
extend( Fighter, Human )
A Fighter
konstruktor / przedmiot posiądą prototyp Human
, więc jeśli zdefiniowanie metod, takich jak live
i die
na Human
czym Fighter
będzie również dziedziczyć tych.
Zaktualizowane wyjaśnienie:
„funkcja wysokiego poziomu”, co oznacza .extend nie jest wbudowana, ale często dostarczana przez bibliotekę, taką jak jQuery lub Prototype.
.extend
nie jest wbudowane, ale często dostarczane przez bibliotekę, taką jak jQuery lub Prototype.changing the native objects can break other developer's assumptions of these objects,
prowadzi to do błędów javascript, których wytropienie może często kosztować wiele godzin. Wiodące zdanie w tej odpowiedzi wydaje się błędnie interpretować tę cenną praktykę javascript..extend()
jest dodawany przez wiele bibliotek innych firm, aby ułatwić tworzenie obiektów z innych obiektów. Przykłady można znaleźć pod adresem http://api.jquery.com/jQuery.extend/ lub http://www.prototypejs.org/api/object/extend ..prototype
odwołuje się do „szablonu” (jeśli chcesz to tak nazwać) obiektu, więc dodając metody do prototypu obiektu (widzisz to często w bibliotekach, aby dodać do String, Date, Math lub nawet Function) te metody są dodawane do każdego nowego wystąpienia tego obiektu.źródło
extend
Sposób na przykład w jQuery lub PrototypeJS , kopiuje wszystkie właściwości ze źródła do obiektu docelowego.Jeśli chodzi o
prototype
właściwość, jest to element składowy obiektów funkcji, jest częścią rdzenia języka.Każda funkcja może służyć jako konstruktor do tworzenia nowych instancji obiektów. Wszystkie funkcje mają tę
prototype
właściwość.Gdy użyjesz
new
operatora with na obiekcie funkcji, zostanie utworzony nowy obiekt, który odziedziczy po swoim konstruktorzeprototype
.Na przykład:
źródło
Dziedziczenie w Javascript wydaje się być wszędzie otwartą debatą. Można go nazwać „Ciekawym przypadkiem języka Javascript”.
Chodzi o to, że istnieje klasa bazowa, a następnie rozszerzasz klasę bazową, aby uzyskać funkcję podobną do dziedziczenia (nie do końca, ale nadal).
Chodzi o to, aby zrozumieć, co naprawdę oznacza prototyp. Nie dostałem tego, dopóki nie zobaczyłem kodu Johna Resiga (blisko tego, co
jQuery.extend
robi), który napisał fragment kodu, który to robi i twierdzi, że źródłem inspiracji były biblioteki base2 i prototyp.Oto kod.
Są trzy części, które wykonują tę pracę. Najpierw przejrzyj właściwości i dodaj je do instancji. Następnie tworzymy konstruktor, który później będzie można dodać do obiektu, a kluczowe linie to:
Najpierw wskaż
Class.prototype
żądany prototyp. Teraz cały obiekt się zmienił, co oznacza, że musisz wymusić powrót układu do jego własnego.I przykład użycia:
Przeczytaj więcej na ten temat tutaj w poście Javascript Inheritance autorstwa Johna Resiga .
źródło
Niektóre
extend
funkcje w bibliotekach innych firm są bardziej złożone niż inne. Na przykład Knockout.js zawiera minimalnie prosty plik, który nie ma niektórych sprawdzeń, które wykonuje jQuery:źródło
.extends()
stworzyć klasę, która jest dzieckiem innej klasy.za kulisami
Child.prototype.__proto__
ustawia swoją wartośćParent.prototype
tak, aby metody były dziedziczone.
.prototype
dziedziczyć funkcje z jednego do drugiego..__proto__
jest narzędziem pobierającym / ustawiającym dla Prototype.źródło