REGISTER











Moștenire
#1
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.
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ări
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.
Code:
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
În practică, mai multe variante ale acestor teme sunt folosite, și poate fi atât puternic cat și de confuz.
Reply



Powered by MyBB All rights reserved
Developed with for FASTCS 2011 - 2024 FASTCS