Fermetures (portée des variables)

Transcription

Fermetures (portée des variables)
Fermetures (portée des variables)
< s c r i p t type =" t e x t / j a v a s c r i p t " >
f u n c t i o n a j o u t e u r ( nombre ) {
funct i on ajoute ( valeur ) {
r e t u r n v a l e u r + nombre ;
}
return ajoute ;
}
var aj out e 10 = a j o u t e u r ( 1 0 ) ;
aj oute10 ( 1 ) ; / / r e t o u r n e 11
</ s c r i p t >
la fonction interne ajoute10 a toujours accès au paramètre effectif
nombre malgré le fait que l’appel à la fonction ajouteur soit terminé.
Arnaud RENARD (URCA)
DHTML
[email protected]
15 / 75
Format de structure de données
JSON
Object
Notation)
Utilise(JavaScript
la syntaxe des
objets
JavaScript
{"menu":
{"id": "file",
"value": "File"
"popup": {"item": [ {"value": "New" },
{"value": "Open"},
{"value": "Close"}] }}}
<menu id="file"
<popup>
<item
<item
<item
</popup>
</menu>
value="File">
value="New" />
value="Open" />
value="Close" />
Équivalent XML
http://www.json.org/
Deux structures :
Objet
{}
JSON {chaîne
(JavaScript
Object Notation)
: valeur}
{chaîne : valeur, chaîne : valeur,
…}
Tableau
[]
[valeur]
[valeur, valeur, …]
Valeur :
chaîne|nombre|objet|tableau|true|false|null
Fonctions anonymes
< s c r i p t type =" t e x t / j a v a s c r i p t " >
var maFonction = f u n c t i o n ( message) {
a l e r t ( message ) ;
};
/ / a f f i c h e : c e c i es t un t e s t
maFonction ( ’ c e c i es t un t e s t ’ ) ;
</ s c r i p t >
<html >
<body onload =" setTim eout ( f u n c t i o n ( ) {
a l e r t ( ’ chargement de l a page term iné ’ )
} , 1500 ) ; " >
</ body>
</ html >
Arnaud RENARD (URCA)
DHTML
[email protected]
18 / 75
fonctions / Object à prototype
< s c r i p t>
function
this
this
this
Cd ( p_chanteuse , p _ t i t r e ) {
. chanteuse=p_chanteuse ;
. t i t r e =p_titre ;
. description = function ( ) {
r e t u r n t h i s . t i t r e +" par "+ t h i s . chanteuse ;
}
t h i s . laChanteuse = af f ic heChanteus e ;
}
f u n c t i o n af f ic h eChanteus e ( ) {
a l e r t ( t h i s . chanteuse ) ;
}
mycd = new Cd ( " Madonna " , " Frozen " ) ;
a l e r t ( mycd . t i t r e ) ; / / Frozen
a l e r t ( mycd . d e s c r i p t i o n ( ) ) ; / / Frozen par Madonna
mycd . laChanteuse ( ) ; / / Madonna
Arnaud RENARD (URCA)
DHTML
[email protected]
19 / 75
fonctions / Object à prototype
Cd.prototype.updateTitre=function(newTitre){
this.titre = newTitre;
}
• On ajoute ainsi une méthode dans le prototype,
toutes les instances y ont donc accès.
• Possibilité d’ajouter la méthode dans un autre fichier.
• Attention, prototype est aussi une bibliothèque js.
• Des limitation sur les objets pré-existants (Date,
Array, String, …)
Arnaud RENARD (URCA)
DHTML
[email protected]
20 / 75
Héritage -like
function Animal(nb_pattes) {
this.pattes = nb_pattes ;
this.dormir = function() { return "ZZZzzz..." ; }
};
Oiso.prototype = new Animal(2) ;
function Oiso() { } ;
Chien.prototype = new Animal(4) ;
function Chien() { } ;
var titi = new Oiso() ;
var grosminet = new Chien() ;
window.alert("Grosminet a " + grosminet.pattes + " pattes") ;
window.alert("Grosminet, au lit ! " + grosminet.dormir() + "") ;
window.alert("Titi a " + titi.pattes + " pattes") ;
Introspection
alert(mycd); // object [Object]
mycd.debug(); // todo !
Introspection
// Testons si cette méthode n'existe pas déjà !
if (!Object.prototype.debug) { // le type natif est Object
// Créons la méthode
Object.prototype.debug = function() {
var text = 'Object {\n';
for (var i in this) {
text += ' [' + i + '] => ' + this[i] + '\n';
}
alert(text + '}');
}
}
Introspection
// Testons si cette méthode n'existe pas déjà !
if (!Object.prototype.debug) { // le type natif est Object
// Créons la méthode
Object.prototype.debug = function() {
var text = 'Object {\n';
for (var i in this) {
if (i !== 'debug') {
text += ' [' + i + '] => ' + this[i] + '\n';
}
}
alert(text + '}');
}
}
JavaScript est un langage orienté objet à base d’instances et
non à base de classes (POO orientée prototype)
Une instance peut être
construite
Développement
orienté
objetà partir d’une fonction
constructeur
this est initialisé par le constructeur pour faire référence à
l’instance courante
L’héritage dans la programmation objet orientée prototype
se fait à base de clonage
L’instance est composée de slots de données (les fonctions
sont des données !)