• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Javascript : fondamentaux et OOP
 

Javascript : fondamentaux et OOP

on

  • 4,375 views

3 fondamentaux de JavaScript : la portée des variables, les fonctions, le contexte.

3 fondamentaux de JavaScript : la portée des variables, les fonctions, le contexte.
Application pour la programmation Orienté Objet en JavaScript

Statistics

Views

Total Views
4,375
Views on SlideShare
4,352
Embed Views
23

Actions

Likes
2
Downloads
85
Comments
0

8 Embeds 23

https://twitter.com 8
http://a0.twimg.com 6
http://www.scoop.it 3
http://paper.li 2
http://us-w1.rockmelt.com 1
https://si0.twimg.com 1
https://twimg0-a.akamaihd.net 1
http://www.linkedin.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Javascript : fondamentaux et OOP Javascript : fondamentaux et OOP Presentation Transcript

    • JavascriptLes fondamentaux La POO Jean-pierre VINCENT
    • Qui ça ? Jean-pierre VINCENTbraincracking.org (veille techno)@theystolemynick10 ans de WebConsultant, formateur, expertise
    • Pourquoi Javascript ?
    • Présent partout● Navigateur● Jeux Web (remplace Flash)● Mobile (Phonegap ...)● Télévisions● Serveur (Node.js, ...)● Software (Chromeless, ...)● OS (JoliCloud, WebOS...)● Windows 8 !
    • Mauvaise réputation
    • Mauvaise réputationparseInt(06); // 6parseInt(08); // 0 wftjs.com
    • Mauvaise réputationtypeof NaN // numberNaN === NaN // falsetypeof null // objectnull instanceof Object // false wftjs.com
    • Mauvaise réputation(1.7976931348623157e+308 === 1.7976931348623158e+308 )// true! alert(111111111111111111111); //alerts 1111111111111111100009999999999999999 //=> 10000000000000000
    • APIs● DOM● Node● WinRT...●
    • Compliqué ?
    • Différent !
    • Historique court● Né pendant la guerre (95)● En quelques semaines● Influence Java, Erlang, Lisp, Python IE et Netscape daccord pour EcmaScript 3
    • Evolution● EcmaScript 5● Harmony● EcmaScript.Next● EcmaScript.Next.Next
    • En attendant ... EcmaScript 3
    • Objectif de cette heure● Savoir deboguer avec 3fondamentaux● Développer Orienté Objet
    • Notions de base● Portée des variables (var + function)● Function()● Contexte (this)
    • Portée des variables 1 closure = 1 portéeClosure = function() { PORTÉE}
    • Portée des variablestest1 = function() { var x = 1; test2 = function() { var x = 2; test3 = function() { var x = 3; console.log(x); // 3 }(); }(); console.log(x); // 1}();console.log(x); // undefined
    • Boucle infinie !function genericFunctionName() { for(i = 0; i < myArray.length; i++) { .... }}for(i = 0; i < 10; i++) { genericFunctionName();}
    • Boucle corrigéefunction genericFunctionName() { for( var i = 0; i<myArray.length;i++){ .... }}for(i = 0; i < 10; i++) { genericFunctionName();}
    • Application pratique(function() { var privateVariable = true; function init() { console.log( privateVariable ); }}())init(); // trueconsole.log(privateVariable);//undefined
    • Créer un scope1 function() { var privateVariable = true; console.log( privateVariable ); } => parse error
    • Créer un scope2( function() { var privateVariable = true; console.log( privateVariable ); }) => rien
    • Créer un scope3( function() { var privateVariable = true; console.log( privateVariable ); })() => true
    • Notions de base✓ Portée des variables (var + function)● Function()● Contexte (this)
    • Function()● function action() {}● action = function() {}● action();
    • function action()Toujours globaleaction(); // true..function action() { console.log(true);}
    • function action()TROP globaleaction(); // a !== 1if( a === 1) { function action() { console.log(a === 1); }} else { function action() { console.log(a !== 1); }}
    • var action = function() Permet de choisir la portée
    • Peut sauto-exécuterautoInit = function() { console.log(hello world);}();// hello world
    • return function()var onDOMEvent = function( el, ev, callback) { if(document.body.attachEvent){ el.attachEvent(on+ev, callback); } else { el.addEventListener( ev, callback); }};
    • return function()var onDOMEvent =function( el, ev, callback) { if(document.body.attachEvent return function(el, ev, callback) {element.attachEvent(on+event, callback); }; else return function(el, ev, callback) { el.addEventListener( ev, callback); };}();
    • Function.prototype var myClass = function () { this.publicVariable = 0;}; myClass.prototype = { decrement:function() { console.log( --this.publicVariable ); }, increment:function() { console.log( ++this.publicVariable ); }};
    • Function.prototype var myClass = function () {}; myClass.prototype = { decrement:function() {}, increment:function() {}};myObject = new myClass();myObject.decrement(); // -1myObject.decrement(); // -2myObject2 = new myClass();myObject2.increment(); // 1myObject2.increment(); // 2
    • HéritagemySubClass = function() { this.publicVariable = 10;};mySubClass.prototype = myClass.prototype; mySubClass.prototype.constructor =mySubClass;myObject2 = new mySubClass();myObject2.increment(); // 11myObject2.increment(); // 12
    • Renvoi dobjetsmyClass = function () { var privateVariable = 0; // public methods return { decrement:function() { console.log( --privateVariable ); }, increment:function() { console.log( ++privateVariable ); } }};
    • Renvoi dobjets myClass = function () { return { decrement:function() { }, increment:function() { } } };myObject = myClass();myObject.decrement(); // -1myObject.decrement(); // -2myObject2 = myClass();myObject2.increment(); // 1myObject2.increment(); // 2
    • Function === ObjectmyClass = function () { return { publicMethod:function() {} }};myClass.staticMethod = function() {};myObject = myClass();myObject.staticMethod(); // ErrormyClass.publicMethod(); // Error
    • Portée + déclarationvar queries = [ new XHR(url1), newXHR(url2), new XHR(url3)];for(var i = 0; i < queries.length; i++) { queries[i].onload = function() { console.log( i ); // référence };}queries[ 0 ].onload(); // 3!queries[ 1 ].onload(); // 3!queries[ 2 ].onload(); // 3!
    • Portée + déclarationfor(var i = 0; i < queries.length; i++) { queries[i].onload = function(i) { return function() { console.log( i ); // valeur }; }(i); // exécution immédiate}// plus tard ...queries[ 0 ].onload(); // 0queries[ 1 ].onload(); // 1queries[ 2 ].onload(); // 2
    • Notions de base✓ Portée des variables (var + function)✓ Function()● Contexte (this)
    • Contextethis = contexte dexécution
    • Contexte - facilemyClass = function() { this.id = myClass;}myClass.prototype = { action:function() { console.log(this.id); }};myObject = new myClass();myObject.action(); // myclass
    • Contexte - DOMmyClass = function() { this.id = myClass;}myClass.prototype = { action:function() { console.log(this.id); }};myObject = new myClass();document.body.onclick = myObject.action;// document.body.id
    • Contexte – tous objetsmyClass = function() { this.id = myClass;}myClass.prototype = { action:function() { console.log(this.id); }};myObject = new myClass();myEvent = { id:myObj2}myEvent.onfire = myObj.action;myEvent.onfire(); // myObj2
    • Contexte – fix natifmyClass = function() { this.id = myClass;}myClass.prototype = { action:function() { console.log(this.id); }};myObject = new myClass();myEvent = { id:myObj2}myEvent.onfire = myObj.action;myEvent.onfire.call( myObject ); // myClass
    • Contexte: sans prototypemyClass = function() { this.id = myClass; var me = this; return { action:function() { console.log(me.id); } }}; myObject = myClass(); document.body.onclick = myObject.action; // myClass
    • Notions de base✓ Portée des variables (var + function)✓ Function()✓ Contexte (this)
    • Développement durable● Pollution du scope global● Programmation Orienté Objet
    • Pollution globale
    • Pollution globale 2 exemples complètement au hasard●Gmail : 33 variables globales (450K lignesde code)● Lemonde.fr : 480 variables globales
    • Actions✗ Function action() {}✓ var action = function() { var myVariable; }✓namespaces
    • Namespacesvar MY_APP_NAMESPACE = {};MY.doSomething = function() {};MY.utils = {};MY.utils.XHR = function() {}
    • Namespaces - astucerécupérer ou créer un namespaceMY = windows.MY || {};MY.utils = MY.utils || {};
    • Création dun scopeRappel(function(){ // début de scope local var private = true;// ici je suis chez moi})(); // fin de scope local
    • ProgrammationOrientéObjet
    • Tout est objet"abc".indexOf(a);[1,2,3].slice(1);13.3714 .toFixed(1);/[0-9]/g.test(10/11/2011);
    • POO Classique new, class, static,public, private,__construct, $this, const,self::, extends, protected,parent::, abstract, final,interface, implements,instanceof
    • POO JSnew (optionel)this (particulier)instanceof
    • Interface publique(function(){ // début de scope local // accès global au constructeur MY.utils.XHR = function( url ) { this.url = url; }; // méthodes ou variable statiques MY.utils.XHR.staticVariable = true;})(); // fin de scope local
    • Raccourci(function(){ // début de scope local // raccourci vers le namespaceutilisé var self = MY.utils.XHR; self.staticVariable = true;})(); // fin de scope local
    • privées communes(function(){ // début de scope local// accès global au constructeurMY.utils.XHR = function( url ) { this.url = url; currentInstances.push( this );};var currentInstances = [];})(); // fin de scope local
    • privées par instance(function(){ // début de scope local// accès global au constructeurMY.utils.XHR = function( url ) { var isConnecting = true; return { query:function() { if( isConnecting) return false; } }};})(); // fin de scope local
    • Combo : factory pattern(function(){MY.utils.XHR = function( ) { throw new Error( please use .getInstance() );};// constructeur privévar XHR = function(url) { console.log(url); };// liste privéevar currentInstances = {};// factoryMY.utils.XHR.getInstance = function( url ) { if(currentInstances[url]) return currentInstances[url]; else return currentInstances[url] = new XHR( url);}})();
    • Tout est émulable● programmation événementielle● tests unitaires et fonctionnels● patterns classiques : MVC, observer,facade, proxy, singleton, factory ...
    • Conclusion● Javascript est différent, apprenez le● OOP réutilisable
    • Questions ?Jean-pierre VINCENTbraincracking.org@theystolemynick