04-08-2013, 08:16 AM
JavaScript suportă ierarhiile de moștenire prin prototipuri proprii.
În următorul exemplu, clasa derivata mosteneste de la clasa de baza.
Când d este creat ca un derivat, trimiterea la instanța de bază a obiectului este copiata la d.base.
Derivă nu conține o valoare pentru aBaseFunction, deci acesta este preluat de la Baze atunci când aBaseFunction este accesată.
Acest lucru este clar prin schimbarea valorii base.aBaseFunction, care se reflectă în valoarea lui d.aBaseFunction.
Unele implementări permit prototipul, pentru a fi accesate sau pentru a seta în mod explicit prin slotul __proto__ așa cum se arată mai jos.
Următorul exemplu arată în mod clar modul în care trimiterile la prototipuri sunt copiate pe crearea de exemplu, dar faptul că schimbările la un prototip poate afecta toate instanțele care se referă la acesta.
În practică, mai multe variante ale acestor teme sunt folosite, și poate fi atât puternic cat și de confuz.
În următorul exemplu, clasa derivata mosteneste de la clasa de baza.
Când d este creat ca un derivat, trimiterea la instanța de bază a obiectului este copiata la d.base.
Derivă nu conține o valoare pentru aBaseFunction, deci acesta este preluat de la Baze atunci când aBaseFunction este accesată.
Acest lucru este clar prin schimbarea valorii base.aBaseFunction, care se reflectă în valoarea lui d.aBaseFunction.
Unele implementări permit prototipul, pentru a fi accesate sau pentru a seta în mod explicit prin slotul __proto__ așa cum se arată mai jos.
Code:
function Base () {
this . anOverride = function () { alert ( "Base::anOverride()" ) ; } ;
this . aBaseFunction = function () { alert ( "Base::aBaseFunction()" ) ; } ;
}
function Derived () {
this . anOverride = function () { alert ( "Derived::anOverride()" ) ; } ;
}
base = new Base () ;
Derived. prototype = base ;
d = new Derived () ; // Copiaza prototipul Derived la slotul d al exemplului de prototip ascuns.
base. aBaseFunction = function () { alert ( "Base::aNEWBaseFunction()" ) }
d. anOverride () ;
d. aBaseFunction () ;
alert ( d. aBaseFunction === Derived. prototype . aBaseFunction ) ; // adevărat
alert ( d.__proto__ === base ) ; // adevărat în implementările pe bază de Mozilla, dar fals în multe alte implementăriCode:
function m1 () { return "One" ; }
function m2 () { return "Two" ; }
function m3 () { return "Three" ; }
function Base () { }
Base. prototype . m = m2 ;
bar = new Base () ;
alert ( "bar.m " + bar. M () ) ; // afiseaza bar.m de doua ori
function Top () { this . m = m3 ; }
t = new Top () ;
foo = new Base () ;
Base. prototype = t ;
// Nici un efect asupra foo, referință la t este copiata.
alert ( "foo.m " + foo. m () ) ; //afiseaza foo.m de doua ori
baz = new Base () ;
alert ( "baz.m " + baz. m () ) ; // baz.m de trei ori
t. m = m1 ; //afecteaza Baz, precum și orice alte clase derivate.
alert ( "baz.m1 " + baz. m () ) ; //afiseaza baz.m1 o singura data