Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

(Re)Découvrir Javascript


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 08/02/2008 15:29:36 Vu : 15 139 fois

Note :
Aucune note

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


Description

Je vous propose de (re)découvrir javascript.
Des notions inconnues, des syntaxes inhabituelles...
Que d'émerveillements!
Pierrick Hymbert

Tutorial




A la (re)-découverte de Javascript…





SOMMAIRE


Introduction    3

Rappel sur ECMAScript    4

Aspects techniques méconnus    5


Introduction


A la lecture de ce tutoriel j’espère vous faire découvrir des aspects méconnus de ce langage passionnant souvent délaissé par les développeurs.

Javascript est un langage de script orienté objet, mis à part le nom, il n’a aucun lien avec java, je dirai qu’il est plus inspiré de Self. Un des vieux problèmes de JavaScript est qu’il a souffert de la guéguerre des navigateurs ( IE vs Netscape ). En effet il a été crée par Netscape mais implémenté par Microsoft, qui comme à son habitude l’a remoulé à sa sauce…

Depuis l’ère du Web 2.0 il est redevenu à la mode avec un certain XMLHttpRequest… Malgré cela, il est toujours aussi peu considéré par les programmeurs coté serveur.Aussi certains de ces aspects sont ignorés, essayons de le dépoussiéré…


Rappel sur ECMAScript


C’est une spécification de l'organisme de standardisation "Ecma International" qui date de 1997. En fait ECMAScript (ECMA-262) correspond à JavaScript Core (hors browser et DOM), seulement à ce jour il n’y aucune implémentation connue.

Les technologies JavaScript et JScript tendent désormais à l'implémentation du standard tout en proposant de nouvelles fonctionnalités pas (encore) incluses dans ECMAScript.

Aspects techniques méconnus


Comme vous le savez peut-être, dans JavaScript tout est objet ou référence à un objet (tableau associatif) :


Définition d’un objet


3 formes possibles :


// Création de l'objet

var MonObjet = new Object;


// Définition classique

MonObjet.attribut = "Attribut";

MonObjet.fonction = function() {

return "Fonction";

}


// Définition en mode tableau associatif

MonObjet['attribut'] = "Attribut";

MonObjet['fonction'] = function() {

return "Fonction";

}


// Définition en mode HashMap ( key/value )

var MonObjet = { attribut: 'Attribut' , fonction: function() { return 'Fonction'; } };


Accès aux « données » de l’objet


// Accès normal

MonObjet.attribut; //retourne "Attribut"

MonObjet.fonction() ; //retourne "Fonction"


// Accès tableau associatif

MonObjet['attribut']; //retourne "Attribut" (équivalent à MonObjet.attribut)

MonObjet['fonction']; : //retourne : function () { return "Fonction"; }

MonObjet['fonction'](); //retourne "Fonction" (équivalent à MonObjet.fonction())


Constructeur

Les constructeurs permettent d’instancie des objets plus complexes, les constructeurs instancient des propriétés communes à une catégorie d’objets ( notion de classe d’objet ). Cette fonction est exécutée à la création de l’objet ( mot clé new ), elle est accessible par la propriété « constructor » de l’instance.


function MonObjetComplexe(param) {

this.description = param;

this.maMethode = function() {

return "Je suis un objet complexe.";

}

}

var o = new MonObjetComplexe("Trop de bla bla");

o.description; //contient "Trop de bla bla"

o.maMethode(); //retourne "Je suis un objet complexe."


A noter que le mot clé this dans le corps du constructeur fait référence à l'objet en cours de création.


Prototypage


Le « prototype » est un objet associé à toute fonction comme référence par les objets créés. Il est accessible via la propriété “prototype” du constructeur. Il existe un mécanisme de remontée des prototypes de récupération de la valeur d'une propriété (existante ou pas) :

- si elle existe au niveau de l'objet, sa valeur est retournée,

- sinon, recherche au niveau du prototype de l'objet,

- sinon, recherche au niveau du prototype du prototype,

- ainsi de suite…

- sinon, retourne “undefined”


L’attribut prototype d’un constructeur permet de modifier dynamiquement des objets créés avec le même constructeur :


function MonObjetComplexe(param) {

this.description = param;

}


var o = new MonObjetComplexe("Trop de bla bla");


// Modification dynamique de toutes les instances de MonObjetComplexe

MonObjetComplexe.prototype.maMethode = function() {

return "Je suis un objet complexe.";

}


// On obtient comme précédemment

o.maMethode(); //retourne "Je suis un objet complexe."


Cette fonctionnalité prévaut également pour les constructeurs prédéfinis de JavaScript :

String.prototype.startsWith = function(pattern) {

return this.indexOf(pattern) === 0;

}


Array.prototype.contains = function( object ){

if ((typeof object == "function") && this.indexOf(object) != -1) return true;

for (var i = 0, length = this.length; i < length; i++)

if( this[i] == object )

return true;

return false;

}


Héritage ( Si si ça marche … )


En fait, l’héritage se fait par assignation de l’objet père au prototype du fils, c’est dynamique et ça marche par remontée de la hiérarchie des prototypes :


// Définit le constructeur parent

function Felin() {

this.griffer = function() {

return "Griffure de " + this.profondeur + " centimetres";

}

}


// Definit un autre constructeur

function Lion(param) {

this.profondeur = param;

}


// Affecte a ce constructeur le constructeur parent

Lion.prototype = new Felin();

Lion.prototype.constructor = Felin;


// Ajoute une méthode

Lion.prototype.attaquer = function() {

return "Grrr grrrr grrr";

}


var monFelin = new Lion("3");


// Ajoute une autre méthode

Felin.prototype.deguerpir = function() {

return "Bye bye";

}


//monFelin.griffer() retourne : "Griffure de "

//monFelin.attaquer() retourne : Grrr grrrr grrr

//monFelin.deguerpir() retourne :Bye bye


Impressionnant non ?


Encapsulation

Propriétés publiques

Les composants (attributs ou méthodes) d'un objet sont, par défaut, accessibles à tous :


function ObjetA() {

this.attribut = "Attribut public";

}

ObjetA.prototype.fonction = function() {

return "Fonction publique";

}

var MonObjetA = new ObjetA();

MonObjetA.attribut; //contient "Attribut public"

MonObjetA.fonction(); //retourne "Fonction publique"


Propriétés privées

Elles sont créés dans le constructeur et accessibles seulement via les méthodes privées de l'objet lui-même :

function ObjetB() {

var attribut = "Attribut privé";

function fonction() {

return "Fonction privée";

}

}

var MonObjetB = new ObjetB();

MonObjetB.attribut; //contient "undefined"

MonObjetB.fonction(); //retourne l'erreur "MonObjetB.fonction() is not a function"


Vous allez me dire, ok, mais comment on accède à la propriété privée attribut, suivez le guide… Par les

Méthodes privilégiées

Méthodes pouvant accéder aux composants privés de l'objet tout en étant accessibles depuis l'extérieur :


function ObjetC() {

var attribut = "Attribut privé";

this.fonction = function() {

return(attribut);

};

}

var MonObjetC = new ObjetC();

MonObjetC.fonction(); //retourne "Attribut privé"


Typage


JavaScript est dynamiquement typé mais cela ne veut pas dire qu'il n'est pas typé.

Il existe des types primaires en JavaScript (number, string, object, boolean, function, undefined). Mais tous les types sont récupérables via l'opérateur typeof.


Le typage est une autre manière de voir: constructor.name :

  • Object : objet générique non typé,
  • Boolean: booléen (vaut true ou false),
  • Number: nombre entier ou décimal,
  • String: chaîne de caractères,
  • Array: tableau,
  • Function: fonction contenant une portion de code,
  • [NomConstructeur]: type défini par l'utilisateur via une fonction constructeur.



Exceptions


Comme dans les langages évolués :

//try... catch... finally

try {

// Code à tester

throw "Erreur 1"; // Une exception est levée

} catch(erreur) {

// Code à exécuter en cas d'erreur

// erreur = “Erreur 1”

} finally {

// Code à exécuter dans les deux cas

}


Une particularité Mozilla permet d’empiler les instructions catch :

try { ... }

catch ( e if e == "InvalidIdException" ) { ... }

catch ( e if e == "InvalidEmailException" ) { ... }

catch ( e if e == "InvalidNameException" ) { ... }

catch ( e ) { ... }


Closures


Ce vilain mot désigne en fait le contexte d'exécution de fonctions imbriquées. La fonction contenue accède aux propriétés de la fonction contenante même après l'exécution de la fonction contenante. C’est magique !

function CreerAction(action) {

return function() {

return "Je suis en train de " + action;

}

}


function Chat() {

this.dormir = CreerActionVoiture("dormir");

this.manger = CreerActionVoiture("manger");

this.griffer = CreerActionVoiture("griffer");

}

var monChat = new Chat();


//monChat.dormir() retourne : Je suis en train de dormir

//monChat.manger() retourne : Je suis en train de manger

//monChat.griffer() retourne : Je suis en train de griffer


Une fois que vous connaissez ce mécanisme, vous comprendrez enfin certaines erreurs incompréhensibles pour un novice, en effet il est très facile de créer des closures sans s’en rendre compte.


ECMAScript for XML (E4X)


Il existe un nouveau type d'objet XML à présent implémenté par Mozilla et Adobe, peut être un jour par Microsoft, il s’utilise ainsi :


var motos = new XML();

motos = <motos>

<moto marque="Suziki" modele="modele2Suziki"/>

<moto marque="Harley" modele="modele1"/>

<moto marque="Honda" modele="modele2Honda"/>

</motos>;

alert(motos.moto.(@marque == "Honda").@modele);

//Affiche: modele2Honda

for each(var moto in motos..@marque) {

alert(moto);

}//Affiche :

//Suziki

//Harley

//Honda


C’est assez prometteur pour les échanges via web-service et l’interopérabilité…


signaler à un administrateur
Commentaire de franz le 29/04/2008 10:36:08

la partie objet est excellente !!!

signaler à un administrateur
Commentaire de Himmeloch le 29/04/2008 21:38:32

La partie Objet est bien faite, même si ça mériterait plus d'exemples, notamment pour ce qui est des attributs privés/publics ;)

Bon tuto sinon.

signaler à un administrateur
Commentaire de Mickeymanu le 21/08/2008 22:44:05

Excellent, c'est pile ce que je recherchais. Arriver à comprendre les différentes syntaxes du javascript et autres bizzareries qu'on recontre parfois.

signaler à un administrateur
Commentaire de naby14 le 28/11/2008 18:10:48

cool,

justement ce que je cherchais pour débuter.
Thanks !!!

signaler à un administrateur
Commentaire de linuski le 02/03/2009 18:36:44

Joli tutorial, merci !
Néanmoins, j'ai une petite remarque à faire à propos du chapitre "typage". En effet, typeof ne permet pas de faire la différence entre un Array et un Object. Pour cela il faut utiliser la propriété "constructor".

Exemple :

var tableau = new Array();
var objet = new Object();

if (tableau.constructor == Array)
{
document.write("tableau est de type Array");
document.write("<br>");
}

if (objet.constructor == Object)
{
document.write("objet est de type Object");
document.write("<br>");
}

signaler à un administrateur
Commentaire de Kimjoa le 20/03/2009 21:39:29

en faite linuski t'as remarque n'est pas fausse, mais la meilleur solution consiste a utilisé la fonction instanceof , instanceof va rechercher tout les constructeurs hétiter d'une instance, un array est d'abord un objet et ensuite un tableau, il possède deux constructeur....
voilà bye

signaler à un administrateur
Commentaire de Heirem le 25/06/2009 00:41:20

Tout simplement merci !!
;o)

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,172 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.