Académique Documents
Professionnel Documents
Culture Documents
Experimentando en la web
Tutoriales,consejosydivagacionesdeunprogramadornovatoeneldesarrolloweb
BLOG
S O B RE E L A UTO R
TUTO RI A L E S JA V A S CRI P T
TUTO RI A L E S W E B G L
CATEGORIAS
Programacin(32) Canvas2D(11) POO(2) webGL(19) three.js(3)
LTIMAS ENTRADAS
Tutorialdealgoritmosenjavascript, backtrackingrecursivo:Cifrasyletras 13mayo,2013 TutorialdePongenJavaScriptII:UnaIA msavanzada. 30abril,2013 Usoprcticodevectores:Pong(yunpoco desonido) 10abril,2013 Three.jsTutorial3Texturas,iluminaciny transparencias. 5abril,2013 Three.jsTutorial2Colores,movimientosy 3D 6marzo,2013
Sieltutorialtehaservidodealgo,invtame aunacerveza!
www.jlabstudio.com/webgl/2012/04/programacion-orientada-a-objetos-en-javascript/
1/7
20/05/13
this.setAtributo4=function(valor){ this.atributo4=valor } this.metodo3=function(valor){ this.atributo4+=17 } } MiClaseHeredada.prototype=newMiPrimeraClase() Comosepuedever,unodelosproblemasmsgravesquepresentabamiprimerintentodePOOesquelasclaseshijas tienenproblemasparallamaralosmtodossobrecargadosdelaclasepadre(porejemplo,elconstructor).Dichoproblema loarreglbamoscambindoleelnombrealmtodoproblemticoenlaclasepadre,aadindoleporejemplounBase. Otroproblema,aunquedemenorimportancia,esquetampocoestabausandoatributosymtodosprivados.Todoseran pblicos.Unlector,Ramn,dejenuncomentarioindicandoqueenlapgina http://imbuzu.wordpress.com/2009/06/14/javascriptorientadoaobjetossegunbuzulosmetodos/mostrabancmo privatizarlasclases.
www.jlabstudio.com/webgl/2012/04/programacion-orientada-a-objetos-en-javascript/
2/7
20/05/13
//Parautilizarlaclase,podramosinicializarlaas(idnticoaJava): varmiClase=newMiClaseMejorada(1,2,3,4) Aprimeravista,pareceunasolucinbrillante.Losmtodosgetterysettertrabajanbien.Conunmtodopblico(por ejemploelget),podemosaccedertantoavariablespblicascomoprivadas.Cuandounmetodopblicoaccedeauna variableprivada,selesueleconocercomomtodoprivilegiado. Paraquedesdelosmtodosprivadossepudieraaaccederalosatributospblicos,hemoshechadomanodeunavariable privadallamadaSELF,porquecomoexplicardespus,elTHISnosiempreapuntaalainstanciadelobjetoqueseest ejecutandoenunmomentodado. Sinembargo,seguimosteniendoelproblemadelasobrecargademtodosconlaherencia.Sienlaclasehijacreamosun mtodoquesellameigualqueenlaclasepadre,peroquesinembargo,queremosqueelmtododelpadresigasiendo accesibledesdelaclasehija,tendramosquevolverausarlaprimitivayhorribletcnicadecambiarleelnombrealmtodo delpadre.
www.jlabstudio.com/webgl/2012/04/programacion-orientada-a-objetos-en-javascript/
3/7
20/05/13
switch(atributo) { case"atributo1": returnthis.atributo1 case"atributo2": returnthis.atributo2 } } MiPrimeraClase.prototype.set=function(atributo,valor){ switch(atributo) { case"atributo1": this.atributo1=valor break case"atributo2": this.atributo2=valor break } } //Mtodos MiPrimeraClase.prototype.metodo1=function(){ this.atributo1+=10 } Comopodemosobservar,laclaseestpartidaen4funciones.Laprimeraserlaquecrealaclase,queademsnos servircomoconstructor.Lepasamosunpardeargumentos,parainiciarsusdosatributos. Acontinuacin,creamossugetterysetter,siguiendolamejoraquevimoseneltutorialdeltiroparablico,yaprovechando eltipadoblandoqueusajavascript. Porltimo,declaramosunmtodoquesimplementeincrementaen10unidadesunodelosatributosdelaclase. Loquenosinteresaaprenderdesteejemploesvercmoseusaelprototipado.Yadijequelasvariablesyfuncionesde javascriptsonobjetos.Elprototypesirveparaextenderlafuncionalidadatodaslasinstanciasdeeseobjeto,pero compartiendoelmismocdigocontodosellos,queesjustoloquemsnosinteresabaconseguir.Asqueusandola palabrareservadaPROTOTYPE,extenderemoselprototipodelafuncin(clase)MiPrimeraClase. Paraverloanmsclaro,hagamoslaejecucinmentaldelsiguientecdigo: window.onload=function(){ varmiClase=newMiPrimeraClase(1,2) varmiClase2=newMiPrimeraClase(3,4) miClase.set("atributo2",5) alert(miClase.get("atributo2")) alert(miClase2.get("atributo2")) } Paraempezar,laconsoladeJavascriptleeralostrozosdecdigoqueformanlaclase,ylosmeteraenmemoria. Acontinuacin,seejecutaraenonloaddelobjetowindows. LasdosprimeraslneascorrespondenalacreacineinicializacindedosinstanciasdenuestraclaseMiPrimeraClase, pasndolelosdosargumentosquenecesitaelconstrutor.ExctamenteigualqueharamosconJava(salvoconunapega, nopodemosdeclararmsconstructores,parasimularsobrecargadeconstructores,habraquejugarconlosargumentos quenosllegan,talycomodijeenlaprimerapartedeltutorialdelSpaceInvaders).Loqueharalaconsoladejavascript seraclonarenmemoriadosveceslafuncinMiPrimeraClase,cadaunaconlosatributosinciadosalvalorcontenidoen suscorrespondientesargumentos.Yaquestelquiddelacuestin:Noclonaelrestodemtodos,porquelafuncin MiPrimeraClaseenrealidadnoloscontiene(comohacamosantes). Sinembargo,graciasalprototipado,cuandoejecutamoselsetsobreelobjetomiClase,laconsoladeJavaScriptbuscar eltrozodememoriadelafuncingetasociadamedianteprototipadoalobjetoMiPrimeraClase,cambindoleaselvalor delatributollamadoatributo2. Porltimo,losdosgetqueusamosenlosalerttrabajandelamismaforma.Cadaunomostrarelvalordelatributo atributo2asociadoasuinstancia,mostrandolosvalorescorrectos(5y4). Peroyqupasaconlaherencia?Vemoslasiguienteclase,queheredardeMiPrimeraClase: //CLASEQUEHEREDAR //Constructor functionMiClaseHeredada(arg1,arg2,arg3){ //Atributosdelaclase MiPrimeraClase.call(this,arg1,arg2)//Llamadaalconstructordelaclasepadre this.atributo3=arg3 } //HERENCIA MiClaseHeredada.prototype=newMiPrimeraClase //GettersySetters
www.jlabstudio.com/webgl/2012/04/programacion-orientada-a-objetos-en-javascript/
4/7
20/05/13
MiClaseHeredada.prototype.get=function(atributo){ switch(atributo) { case"atributo3": returnthis.atributo3 default: returnMiPrimeraClase.prototype.get.call(this,atributo)//Llamadaalgetdelaclasepadre } } MiClaseHeredada.prototype.set=function(atributo,valor){ switch(atributo) { case"atributo3": this.atributo3=valor break default: MiPrimeraClase.prototype.set.call(this,atributo,valor)//Llamadaalsetdelaclasepadre break } } Comovemos,laclasetambinestpartida,en4trozos.Elprimero,comoanteseselconstructor.Perofijmonosantes enelsegundotrozo,queesslounalnea:AsescomohacemosqueMiClaseHeredadaherededeMiPrimeraClase.Es decir,quelosmtodosdelprototipadodeMiPrimeraClasetambinpertenezcanalprototipadodelaclase MiClaseHeredada.Simplementememorzaloyaplcalodeaquenadelante. Volvamosalconstructor.Nuestraclasedeclaraunnuevoatributoatributo3,asiquejuntoalosatributosqueheredamos delaclasepadre,hacequeelconstructorrequierade3argumentosparainicializarlosconalgnvalor. Podramoshaberhechosimplementeunthis.atributo1=arg1this.atributo2=arg2this.atributo3=arg3peroparaqu repetircdigoqueyahaceelconstructordelpadre?Asqueusandoelprototipadopodemoshacerunallamada(mtodo CALL)alconstructordelaclasepadre.Notepreocupesporentendercmofunciona.Tebastaconsaberquenecesitaal menosunargumento:Elobjetosobreelqueejecutarlafuncinalaqueestamosllamando.Enestecaso,elTHIS,para quelosatributoscreadosporelconstructordelpadresecreentambinenlaclasehijaquehacelallamada.Elrestode argumentos,simplementeseconcatenarncomoargumentosalafuncinsobrelaqueseaplicaelCALL.Ycomola funcinalaqueestamosllamandoeselconstructor,querequierededosargumentos,sonlosargumentosquetambin (enelordencorrecto)lepasamosalCALL.EsunaformaelegantedesimularelutilsimoSUPERdeJava,conuna mejora:Situviramosunajerarquadeclasesdemsdedosniveles,podramosllamaralconstructordelabuelo directamente,algoqueconJavanosepuedehacer. Despusdelconstructorydelaherencia,vienenlosmtodosgetterysetter.Comprobamossielatributosobreelque trabajareselalgunodelosquehemosdeclaradoenestaclase.Sinoesas,llamamosalGEToSETdelaclasepadre(a travsdelprototype,yaqueadiferenciadelconstructor,aqulloseranmtodosprototipados)conlosargumentos adecuados.Yas,evitamosduplicarcdigo. Porltimo,yparamostrarquestofunciona,probemoselsiguientecdigo: window.onload=function(){ varclaseHeredada1=newMiClaseHeredada(1,2,3) varclaseHeredada2=newMiClaseHeredada(4,5,6) alert(claseHeredada1.get("atributo3")) claseHeredada1.set("atributo1",10) alert(claseHeredada1.get("atributo1")) claseHeredada2.metodo1() alert(claseHeredada2.get("atributo1")) } Consteejemplocomprobaremosquetodofunciona:Queelconstructordelaclasehijainicializacorrectamentelos atributosdelaclasepadre,queelgetysetdelaclasehijallamacorrectamentealdelaclasepadre,yqueelmtodo metodo1delaclasepadreesaccesibleenlaclasehija.Sitodomarchabien,semuestra1,10y14. Ycontodasestasenseanzas,yadisponesdeunaestupendaformadeimplementarPOOentusfuturoscdigos mejorandoconellolaampliacinymantenimientodetusprogramasweb.Apartirdeahora,serlafilosofaqueseguir paraprogramarlossiguientestutoriales. Etiquetas:javascript,programacionorientadaobjetos
BrunoMichelSanchez
8deabrilde2012alas18:38
Exelenteamigo!!
BrunoMichelSanchez
8deabrilde2012alas23:59
www.jlabstudio.com/webgl/2012/04/programacion-orientada-a-objetos-en-javascript/
5/7
20/05/13
PatrickSvensson
25deabrilde2012alas09:27
jgrc
28deabrilde2012alas20:20
Gerard
12deagostode2012alas19:13
Muchasgracias.Contutorialescomoestoslacosasehaceunpocomsfacil
Gerard
12deagostode2012alas19:24
JuanPablo
7deoctubrede2012alas21:32
jose
24demarzode2013alas11:25
Eltutoestamuybuenofelicidades.Perosinceramentejsapesta.Aversiseespavilanylomejoranparaque podamksdisfrutardeunlenguajeestructuradoycontodaslasposivilidadesdeunlenguajepoo.
ALdo
20deabrilde2013alas23:29
Nombre(obligatorio)
Email(noserpublicado)(obligatorio)
Pginaweb(sitienesuna)
Comentario
www.jlabstudio.com/webgl/2012/04/programacion-orientada-a-objetos-en-javascript/
6/7
20/05/13
www.jlabstudio.com/webgl/2012/04/programacion-orientada-a-objetos-en-javascript/
7/7