SlideShare ist ein Scribd-Unternehmen logo
1 von 155
Downloaden Sie, um offline zu lesen
Tehnologii Web




                                            Dr. Sabin Buragawww.purl.org/net/busaco
     Programare Web – supliment
o prezentare generala a limbajului JavaScript
Dr. Sabin Buragawww.purl.org/net/busaco
“Un arcas bun atinge tinta
 chiar inainte de a trage.”



      Ch’Ao Pu-Che
istoric




                                  Dr. Sabin Buragawww.purl.org/net/busaco
Inventat de Brendan Eich (1995)

   denumit initial LiveScript
istoric




                                        Dr. Sabin Buragawww.purl.org/net/busaco
Implementat in premiera de browser-ul
        Netscape Navigator
istoric




                                       Dr. Sabin Buragawww.purl.org/net/busaco
Adaptat de Microsoft: JScript (1996)
istoric




                                              Dr. Sabin Buragawww.purl.org/net/busaco
       Standardizat in 1997 de ECMA
European Computer Manufacturers Association

               ECMAScript
               ECMA-262



       www.ecma-international.org
istoric




                                                                 Dr. Sabin Buragawww.purl.org/net/busaco
       Standardizat in 1997 de ECMA
European Computer Manufacturers Association

                      ECMAScript


 versiunea standardizata actuala: 5.1 (iunie 2011)
        versiunea in lucru: 6.0 (în curând)

www.ecma-international.org/publications/standards/Ecma-262.htm
caracteristici




                                     Dr. Sabin Buragawww.purl.org/net/busaco
Limbaj de tip script (interpretat)
caracteristici




                                          Dr. Sabin Buragawww.purl.org/net/busaco
 Limbaj de tip script (interpretat)

destinat sa manipuleze, sa automatizeze
   si sa integreze facilitatile oferite
          de un anumit sistem
caracteristici




                                             Dr. Sabin Buragawww.purl.org/net/busaco
 Limbaj de tip script (interpretat)

nu necesita intrari/iesiri in mod implicit
Dr. Sabin Buragawww.purl.org/net/busaco
Cum putem executa programele JavaScript?
caracteristici




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
    Mediu de executie (host-environment)

                    navigator Web

permite rularea de aplicatii Web la nivelul unei platforme
                 (un sistem de operare)

              desktop (e.g., Windows 8)
            mobil (Android, iOS, WP7, WP8)
                          …
caracteristici




                                                Dr. Sabin Buragawww.purl.org/net/busaco
Mediu de executie (host-environment)

              navigator Web

        “injectarea” de cod JavaScript
in documentele (X)HTML via elementul <script>
caracteristici




                                                Dr. Sabin Buragawww.purl.org/net/busaco
Mediu de executie (host-environment)

               navigator Web

        “injectarea” de cod JavaScript
in documentele (X)HTML via elementul <script>

    cod extern vs. cod inclus in pagina Web
caracteristici




                                           Dr. Sabin Buragawww.purl.org/net/busaco
Mediu de executie (host-environment)

  platforma de dezvoltare a aplicatiilor

               e.g., Flex/AIR
caracteristici




                                            Dr. Sabin Buragawww.purl.org/net/busaco
Mediu de executie (host-environment)

        software de sine-statator

     Adobe Creative Suite, UltraEdit etc.
caracteristici




                                       Dr. Sabin Buragawww.purl.org/net/busaco
Mediu de executie (host-environment)

    procesor (engine) independent

            exemplificare:
         Yahoo! Widget Engine
caracteristici




                                        Dr. Sabin Buragawww.purl.org/net/busaco
Mediu de executie (host-environment)

 componente ale sistemului de operare

          Dashboard – Mac OS X
       Sidebar – Windows Vista/7
caracteristici




                                       Dr. Sabin Buragawww.purl.org/net/busaco
Mediu de executie (host-environment)

             server Web

         exemplu tipic: node.js
caracteristici: sintaxa




                                                       Dr. Sabin Buragawww.purl.org/net/busaco
               Cuvinte rezervate:

 break else new var case finally return void catch
for switch while continue function this with default
     if throw delete in try do instanceof typeof
caracteristici: sintaxa




                                                    Dr. Sabin Buragawww.purl.org/net/busaco
           Alte cuvinte rezervate:

abstract enum int short boolean export interface
 static byte extends long super char final native
 synchronized class float package throws const
  goto private transient debugger implements
      protected volatile double import public
caracteristici: tipuri de date




                                  Dr. Sabin Buragawww.purl.org/net/busaco
           Number

 reprezentare in dubla precizie

       stocare pe 64 biti
caracteristici: tipuri de date




                                   Dr. Sabin Buragawww.purl.org/net/busaco
             String

 secvente de caractere Unicode

  fiecare caracter ocupa 16 biti
caracteristici: tipuri de date




                                                Dr. Sabin Buragawww.purl.org/net/busaco
                 Boolean

secvente ce se pot evalua ca fiind true/false
caracteristici: tipuri de date




                                 Dr. Sabin Buragawww.purl.org/net/busaco
           Object

           Function
             Array
             Date
            RegExp

            si altele
caracteristici: tipuri de date




                                 Dr. Sabin Buragawww.purl.org/net/busaco
             Null

   semnifica “nici o valoare”
caracteristici: tipuri de date




                                                  Dr. Sabin Buragawww.purl.org/net/busaco
                 Undefined

are semnificatia “nici o valoare asignata inca”
caracteristici: tipuri de date




                                 Dr. Sabin Buragawww.purl.org/net/busaco
     Nu exista valori intregi
caracteristici: tipuri de date




                                             Dr. Sabin Buragawww.purl.org/net/busaco
        Nu exista valori intregi

convertirea unui sir in numar: parseInt ()

           parseInt ("123")  123
            parseInt ("11", 2)  3

                             indica baza
                            de numeratie
caracteristici: tipuri de date




                                             Dr. Sabin Buragawww.purl.org/net/busaco
Operatii avansate cu numere se pot realiza
       via obiectul predefinit Math
caracteristici: tipuri de date




                                             Dr. Sabin Buragawww.purl.org/net/busaco
Operatii avansate cu numere se pot realiza
       via obiectul predefinit Math

           constante predefinite:
                  Math.PI
                  Math.E
                 Math.LN10
                    etc.
caracteristici: tipuri de date




                                                                 Dr. Sabin Buragawww.purl.org/net/busaco
   Operatii avansate cu numere se pot realiza
          via obiectul predefinit Math

                          metode:
Math.abs(x) Math.ceil(x) Math.cos(x) Math.exp(x) Math.floor(x)
   Math.log(x) Math.max(x, ..) Math.min(x, ..) Math.pow(x, y)
  Math.random() Math.round(x) Math.sin(x) Math.sqrt(x) etc.
caracteristici: tipuri de date




                                  Dr. Sabin Buragawww.purl.org/net/busaco
“Valoarea” NaN (“not a number”)

      parseInt ("Salut")  NaN
       isNaN (NaN + 3)  true
caracteristici: tipuri de date




                                 Dr. Sabin Buragawww.purl.org/net/busaco
        Valori speciale:

            Infinity
            –Infinity
caracteristici: tipuri de date




                                             Dr. Sabin Buragawww.purl.org/net/busaco
Un caracter reprezinta un sir de lungime 1
caracteristici: tipuri de date




                                 Dr. Sabin Buragawww.purl.org/net/busaco
      Sirurile sunt obiecte

         "Salut".length  5
caracteristici: tipuri de date




                                                     Dr. Sabin Buragawww.purl.org/net/busaco
          Metode pentru siruri:

s.charAt(pos) s.charCodeAt(pos) s.concat(s1, ..)
                 s.indexOf(s1, start)
   s.match(regexp) s.replace(search, replace)
     s.slice(start, end) s.split(separator, limit)
               s.substring(start, end)
        s.toLowerCase() s.toUpperCase()
                         etc.
caracteristici: tipuri de date




                                        Dr. Sabin Buragawww.purl.org/net/busaco
 Valorile 0, "", NaN, null, undefined
 sunt interpretate ca fiind false

              !!234  true
caracteristici: variabile




                                              Dr. Sabin Buragawww.purl.org/net/busaco
    Variabilele se declara cu var

         var marime;
         var numeAnimal = "Tux";

variabilele declarate fara valori asignate,
          se considera undefined
caracteristici: variabile




                                            Dr. Sabin Buragawww.purl.org/net/busaco
        Daca nu se foloseste var,
atunci variabila este considerata globala



          de evitat asa ceva!
caracteristici: variabile




                                             Dr. Sabin Buragawww.purl.org/net/busaco
Valorile sunt “legate” tardiv la variabile
             (late binding)
caracteristici: variabile




                                                          Dr. Sabin Buragawww.purl.org/net/busaco
Mai nou, exista posibilitatea marginirii
domeniului de vizibilitate (scope) via let

    var x = 5;
    var y = 0;
    console.log (let (x = x + 10, y = 12) x + y); // 27
    console.log (x + y);                          // 5
caracteristici: operatori




                                                          Dr. Sabin Buragawww.purl.org/net/busaco
              Pentru numere: + – * / %

             De asignare: += –= *= /= %=

      Incrementare & decrementare: ++ – –

Concatenare de siruri: "Java" + "Script"  "JavaScript"
caracteristici: operatori




                                         Dr. Sabin Buragawww.purl.org/net/busaco
Conversia tipurilor se face “din zbor”

            "3" + 4 + 5  345
             3 + 4 + "5"  75

   adaugând un sir vid la o expresie,
    o convertim pe aceasta la string
caracteristici: operatori




                                          Dr. Sabin Buragawww.purl.org/net/busaco
Comparatii: < > <= >= (numere & siruri)

   egalitatea se testeaza cu == si !=

             1 == true  true
caracteristici: operatori




                                                   Dr. Sabin Buragawww.purl.org/net/busaco
Comparatii: < > <= >= (numere & siruri)

   egalitatea se testeaza cu == si !=

               1 == true  true
        a se folosi: 1 === true  false

                               inhiba conversia
                               tipurilor de date
caracteristici: operatori




                                                   Dr. Sabin Buragawww.purl.org/net/busaco
Aflarea tipului unei expresii: operatorul typeof
                typeof "Tux"  string
caracteristici: operatori




                                     Dr. Sabin Buragawww.purl.org/net/busaco
  Operatorii logici && si ||

  var nume = unNume || "Implicit";
caracteristici: operatori




                                                                 Dr. Sabin Buragawww.purl.org/net/busaco
                Operatorul de test ? :

var prezenta = (studenti > 33) ? "Prea multi" : "Cam putini…";
caracteristici: control




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
             Testare: if … else, switch
pentru switch, sunt permise expresii la fiecare case
    (testarea se realizeaza cu operatorul ===)

switch (2 + 3) { /* sunt permise expresii */
  case 4 + 1 : egalitate ();
                break;
  default     : absurd (); // nu se apeleaza niciodata
}
caracteristici: control




                                                Dr. Sabin Buragawww.purl.org/net/busaco
         Ciclare: while, do … while, for

do {
   var nume = preiaNume ();
} while (nume != "");
for (var contor = 0; contor < 33; contor++) {
   // de 33 de ori…
}
caracteristici: control




                                                       Dr. Sabin Buragawww.purl.org/net/busaco
           Exceptii: try … catch … finally
try {
   // Linii "periculoase" ce pot cauza exceptii
} catch (eroare) {
   // Linii executate la aparitia unei/unor exceptii
} finally {
   // Linii care se vor executa la final
}
caracteristici: control




                                                       Dr. Sabin Buragawww.purl.org/net/busaco
           Exceptii: try … catch … finally
try {
   // Linii "periculoase" ce pot cauza exceptii
} catch (eroare) {
   // Linii executate la aparitia unei/unor exceptii
} finally {
   // Linii care se vor executa la final
}

           emiterea unei exceptii: throw
      throw new Error ("O eroare de-a noastra!...");
caracteristici: obiecte




                          Dr. Sabin Buragawww.purl.org/net/busaco
 Perechi nume—valoare
caracteristici: obiecte




                                            Dr. Sabin Buragawww.purl.org/net/busaco
      Perechi nume—valoare




   tabele de dispersie (hash) in C/C++
tablouri asociative in Perl, PHP sau Ruby
            HashMaps in Java
caracteristici: obiecte




                                              Dr. Sabin Buragawww.purl.org/net/busaco
        Perechi nume—valoare

numele este desemnat de un sir de caractere

       valoarea poate fi de orice tip
caracteristici: obiecte




                                          Dr. Sabin Buragawww.purl.org/net/busaco
   Obiect  colectie de proprietati,
     avand mai multe atribute



proprietatile pot contine alte obiecte,
    valori primitive sau metode
caracteristici: obiecte predefinite




                                      Dr. Sabin Buragawww.purl.org/net/busaco
               Global
               Object
              Function
               Array
               String
              Boolean
              Number
                Math
                Date
               Regex
caracteristici: obiecte




                                                  Dr. Sabin Buragawww.purl.org/net/busaco
   Create prin intermediul operatorului new:

var ob = new Object();

var ob = { }; // echivalent cu linia anterioara
caracteristici: obiecte




                                                  Dr. Sabin Buragawww.purl.org/net/busaco
   Create prin intermediul operatorului new:

var ob = new Object();

var ob = { }; // echivalent cu linia anterioara

          se prefera aceasta sintaxa
caracteristici: obiecte




                                          Dr. Sabin Buragawww.purl.org/net/busaco
Accesarea proprietatilor – operatorul .

         ob.nume = "Tux";
         var nume = ob.nume;
caracteristici: obiecte




                            Dr. Sabin Buragawww.purl.org/net/busaco
Accesarea proprietatilor:

  ob.nume = "Tux";
  var nume = ob.nume;

      echivalent cu:
  ob["nume"] = "Tux";
  var nume = ob["nume"];
caracteristici: obiecte




                                Dr. Sabin Buragawww.purl.org/net/busaco
     Declarare + asignare:

var pinguin = {
       nume: "Tux",
       proprietati: {
            culoare: "verde",
            marime: 17
       }
}
caracteristici: obiecte




                                            Dr. Sabin Buragawww.purl.org/net/busaco
              Accesare:

    pinguin.proprietati.marime  17

pinguin["proprietati"]["culoare"]  verde
caracteristici: obiecte




                                                              Dr. Sabin Buragawww.purl.org/net/busaco
   Iterarea proprietatilor – considerate chei:

var pinguin = { 'nume': 'Tux', 'marime': 17 };
for (var proprietate in pinguin) {
     afiseaza (proprietate + ' = ' + pinguin[proprietate]);
}
caracteristici: tablouri




                                      Dr. Sabin Buragawww.purl.org/net/busaco
  Tipuri speciale de obiecte



proprietatile (cheile) sunt numere,
      nu siruri de caractere
caracteristici: tablouri




                                              Dr. Sabin Buragawww.purl.org/net/busaco
    Se poate utiliza sintaxa de la obiecte:

var animale = new Array ();
animale[0] = "pinguin";
animale[1] = "omida";
animale[2] = "pterodactil";

animale.length  3
caracteristici: tablouri




                                                          Dr. Sabin Buragawww.purl.org/net/busaco
    Se poate utiliza sintaxa de la obiecte:

var animale = new Array ();
animale[0] = "pinguin";
animale[1] = "omida";
animale[2] = "pterodactil";

animale.length  3

           notatie alternativa – preferata:
     var animale = ["pinguin", "omida", "pterodactil"];
caracteristici: tablouri




                                                     Dr. Sabin Buragawww.purl.org/net/busaco
Tablourile pot avea “gauri” (sparse arrays):

var animale = ["pinguin", "omida", "pterodactil"];
animale[33] = "om";
animale.length  34
typeof animale[13]  undefined
caracteristici: tablouri




                                                     Dr. Sabin Buragawww.purl.org/net/busaco
Tablourile pot avea “gauri” (sparse arrays):

var animale = ["pinguin", "omida", "pterodactil"];
animale[33] = "om";
animale.length  34
typeof animale[13]  undefined

     pentru a adauga elemente putem recurge la:
           animale[animale.length] = altAnimal;
caracteristici: tablouri – exemplu




                                                                  Dr. Sabin Buragawww.purl.org/net/busaco
var vector = [ ];
vector[0] = "zero";
vector[new Date().getTime()] = "now";
vector[3.14] = "pi";

for (var elem in vector) {
   console.log ("vector[" + elem + "] = " + vector[elem] +
                 ", typeof( " + elem +") == " + typeof (elem));
}

                    adaptare dupa John Kugelman (2009)
Dr. Sabin Buragawww.purl.org/net/busaco
rezultatul obtinut in urma rularii programului JavaScript
                        via JS Bin
caracteristici: tablouri




                                                Dr. Sabin Buragawww.purl.org/net/busaco
                          Interari:

for (var it = 0; it < animale.length; it++) {
  // de prelucrat animale[it]
}
caracteristici: tablouri




                                                             Dr. Sabin Buragawww.purl.org/net/busaco
                          Interari:

for (var it = 0; it < animale.length; it++) {
  // de prelucrat animale[it]
}
                                 de ce?
 // varianta mai buna
for (var it = 0, lung = animale.length; it < lung; it++) {
  // de prelucrat animale[it]
}
caracteristici: tablouri




                                               Dr. Sabin Buragawww.purl.org/net/busaco
      Elementele pot apartine
    unor tipuri de date eterogene

var animale = [33, "vierme", false, "gaga"];
caracteristici: tablouri




                                                    Dr. Sabin Buragawww.purl.org/net/busaco
                Metode utile:

  a.toString() a.concat(item, ..) a.join(sep)
     a.pop() a.push(item, ..) a.reverse()
          a.shift() a.unshift([item]..)
a.sort(cmpfn) a.splice(start, delcount, [item]..)
                      etc.
caracteristici: functii




                                           Dr. Sabin Buragawww.purl.org/net/busaco
             Definite via function

function transformaPixeliInPuncte (px) {
       var puncte = px * 300;
       return puncte;
}
caracteristici: functii




                                             Dr. Sabin Buragawww.purl.org/net/busaco
Daca nu este intors nimic in mod explicit,
 valoarea de retur se considera undefined
caracteristici: functii




                                                    Dr. Sabin Buragawww.purl.org/net/busaco
Parametrii pot lipsi, fiind considerati undefined
caracteristici: functii




                                           Dr. Sabin Buragawww.purl.org/net/busaco
Pot fi transmise mai multe argumente,
     cele in surplus fiind ignorate

 transformaPixeliInPuncte (10, 7)  3000
caracteristici: functii




                                                        Dr. Sabin Buragawww.purl.org/net/busaco
 Argumentele primite de o functie se acceseaza
           via tabloul arguments:

function aduna () {
  var suma = 0;
  for (var i = 0, j = arguments.length; i < j; i++) {
    suma += arguments[i];
  }
  return suma;
}
caracteristici: functii




                                             Dr. Sabin Buragawww.purl.org/net/busaco
       Functiile sunt tot obiecte

astfel, pot fi specificate functii anonime

                                  expresii
                                  lambda
caracteristici: functii




                                                      Dr. Sabin Buragawww.purl.org/net/busaco
          Functiile sunt tot obiecte

  astfel, pot fi specificate functii anonime

                                        expresii
                                        lambda



in acest sens, JavaScript este un limbaj functional
caracteristici: functii




                                                          Dr. Sabin Buragawww.purl.org/net/busaco
var media = function () { // calculul mediei a N numere
     var suma = 0;
     for (var iter = 0,
          lung = arguments.length;
          iter < lung; iter++) {
       suma += arguments[iter];
     }
     return suma / arguments.length;
  };
Dr. Sabin Buragawww.purl.org/net/busaco
Dr. Sabin Buragawww.purl.org/net/busaco
precizati ce efect vor avea liniile de cod urmatoare:
            console.log ( typeof (media) );
                console.log ( media() );
Dr. Sabin Buragawww.purl.org/net/busaco
 variabila media este de tip function
apelul media() intoarce valoarea NaN
functii recursive in JavaScript

/* determina numarul caracterelor din nodurile text




                                                                     Dr. Sabin Buragawww.purl.org/net/busaco
    ale arborelui DOM-ului asociat unui document */
function numaraCaractereDinNoduriText (element) {
   if (element.nodeType == 3) { // nod text (din DOM)
     return element.nodeValue.length;
   }
   var contor = 0;
   // recursiv, numaram caracterele fiecarui nod copil
   // al arborelui DOM cu radacina ‘element’
   for (var it = 0, copil; copil = element.childNodes[it]; it++) {
     contor += numaraCaractereDinNoduriText (copil);
   }
                                                   vezi cele
   return contor;                              discutate la DOM
}
Dr. Sabin Buragawww.purl.org/net/busaco
 // varianta folosind functii anonime
var nrCaractDoc = (function (element) {
   if (element.nodeType == 3) { // nod text
      return element.nodeValue.length;
   }
   var contor = 0;
   for (var it = 0, copil; copil = element.childNodes[it]; it++) {
      contor += arguments.callee (copil);
   }
   return contor;                         furnizeaza care-i
                                           functia apelanta
}) (xml.root);
caracteristici: de la functii la clase




                                         Dr. Sabin Buragawww.purl.org/net/busaco
             Exemplificare:
    dorim sa procesam – via functii –
     caracteristici ale unor animale
caracteristici: de la functii la clase




                                            Dr. Sabin Buragawww.purl.org/net/busaco
function creeazaAnimal (nume, marime) {
  return { nume: nume, marime: marime }
}
function oferaNume (animal) {
  return animal.nume;
}
function oferaMarime (animal) {
  return animal.marime;
}
caracteristici: de la functii la clase




                                                  Dr. Sabin Buragawww.purl.org/net/busaco
function creeazaAnimal (nume, marime) {
  return { nume: nume, marime: marime }
}
function oferaNume (animal) {
  return animal.nume;
}
function oferaMarime (animal) {
  return animal.marime;
}
           var tux = creeazaAnimal ("Tux", 17);
                  oferaMarime (tux)  17
caracteristici: de la functii la clase




                                                Dr. Sabin Buragawww.purl.org/net/busaco
           O “clasa” referitoare la animale:
function creeazaAnimal (nume, marime) {
  return {
    nume: nume,                // date-membre
    marime: marime,
    oferaNume: function () { // metoda
       return animal.nume;
    },
    oferaMarime: function () { // metoda
      return animal.marime;
   }
}
caracteristici: de la functii la clase




                                             Dr. Sabin Buragawww.purl.org/net/busaco
       Apelarea metodelor definite:

      var tux = creeazaAnimal ("Tux", 17);

            tux.oferaMarime()  17
caracteristici: de la functii la clase




                                                 Dr. Sabin Buragawww.purl.org/net/busaco
   Apelind insa o functie fara notatia cu “.”,
       nu obtinem rezultatul scontat:

         var marimea = tux.oferaMarimea;

           oferaMarimea ()  undefined
caracteristici: de la functii la clase




                                                               Dr. Sabin Buragawww.purl.org/net/busaco
        Apelind insa o functie fara notatia cu “.”,
            nu obtinem rezultatul scontat:

              var marimea = tux.oferaMarimea;

                oferaMarimea ()  undefined

obiectul curent (“this”) este setat ca fiind obiectul global
        (in browser, reprezinta fereastra curenta
      in care este redat documentul: this  window)
caracteristici: de la functii la clase




                                                    Dr. Sabin Buragawww.purl.org/net/busaco
function Animal (nume, marime) {
  this.nume = nume;                // date-membre
  this.marime = marime;
  this.oferaNume = function () { // metoda
      return this.nume;
  };
  this.oferaMarime = function () { // metoda
      return this.marime;
   };
}
                        creational pattern
caracteristici: de la functii la clase




                                                              Dr. Sabin Buragawww.purl.org/net/busaco
                                         clase – utilizarea
                                          constructorilor
function Animal (nume, marime) {
  this.nume = nume;                // date-membre
  this.marime = marime;
  this.oferaNume = function () { // metoda
      return this.nume;
  };
  this.oferaMarime = function () { // metoda
      return this.marime;
   };
}
caracteristici: de la functii la clase




                                                                    Dr. Sabin Buragawww.purl.org/net/busaco
                                          clase – utilizarea
                                           constructorilor
function Animal (nume, marime) {
  this.nume = nume;                // date-membre
  this.marime = marime;
  this.oferaNume = function () { // metoda
      return this.nume;
  };
  this.oferaMarime = function () { // metoda
      return this.marime;
   };
}
    var tux = new Animal ("Tux", 17); // instantierea unui obiect
caracteristici: functii & obiecte




                                                             Dr. Sabin Buragawww.purl.org/net/busaco
      Operatorul new creaza un nou obiect vid si
apeleaza functia specificata cu this setat pe acest obiect


          aceste functii se numesc constructori,
                  trebuie apelate via new
   si, prin conventie, au numele scris cu litera mare
caracteristici: functii & obiecte




                                                             Dr. Sabin Buragawww.purl.org/net/busaco
Metodele pot fi declarate si in exteriorul constructorului

function oferaNumeAnimal () {
  return this.nume;
}
function Animal (nume, marime) {
  this.nume = nume;
  this.marime = marime;
  this.oferaNume = oferaNumeAnimal;
}
caracteristici: prototipuri




                                                  Dr. Sabin Buragawww.purl.org/net/busaco
Structura unei clase poate fi extinsa ulterior,
       folosind proprietatea prototype
caracteristici: prototipuri




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
 Structura unei clase poate fi extinsa ulterior,
        folosind proprietatea prototype




un prototip e o proprietate oferind o legatura ascunsa
caracteristici: prototipuri




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
Structura unei clase poate fi extinsa ulterior,
       folosind proprietatea prototype




 daca se incearca accesarea unui element inexistent
               in cadrul unui obiect dat,
se va verifica lantul de prototipuri (prototype chain)
caracteristici: prototipuri




                                                                                        Dr. Sabin Buragawww.purl.org/net/busaco
                    ObjB.prototype = new ObjA ( );
    ObjA

this.initA ( )                            ObjC.prototype = new ObjB ( );
                           ObjB

                       this.initB ( )           ObjC
                                                              var test = new objC ( )
                                            this.initC ( )    test.initA ( );




             dupa Subramanyan Murali, “JavaScript Design Patterns”, 2008
caracteristici: prototipuri




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
function Animal (nume, marime) { // definitie initiala
  this.nume = nume;
  this.marime = marime;
}

Animal.prototype.oferaNume = function() {
   return this.nume;
};
Animal.prototype.oferaMarime = function() {
   return this.marime;
};
caracteristici: prototipuri




                                                          Dr. Sabin Buragawww.purl.org/net/busaco
         Pentru a cunoaste tipul unui obiect
(pe baza constructorului si a ierarhiei de prototipuri)
          se foloseste operatorul instanceof
caracteristici: prototipuri




                                            Dr. Sabin Buragawww.purl.org/net/busaco
var marimi = [17, 20, 7, 14];
marimi instanceof Array            true
marimi instanceof Object           true
marimi instanceof String           false

var tux = new Animal ("Tux", 17);
tux instanceof Object              true
tux instanceof Array               false
caracteristici: extinderea claselor




                                                  Dr. Sabin Buragawww.purl.org/net/busaco
Adaugarea unei metode se realizeaza via prototype


 Animal.prototype.oferaNumeMare = function () {
    return this.nume.toUpperCase ();
 };

 tux.oferaNumeMare ()  "TUX"
caracteristici: extinderea claselor




                                                                             Dr. Sabin Buragawww.purl.org/net/busaco
           Pot fi extinse si obiectele predefinite:
 // adaugam o metoda obiectului String
String.prototype.inverseaza = function () {
  var inv = '';
  for (var iter = this.length - 1; iter >= 0; iter--) { // inversam sirul…
     inv += this[iter];
  }
  return inv;
};
"Web".inverseaza ()  "beW"
caracteristici: extinderea claselor




                                                   Dr. Sabin Buragawww.purl.org/net/busaco
Cel mai general prototype este cel al lui Object

Una dintre metodele disponibile este toString()
    care poate fi supra-scrisa (over-ride)
caracteristici: extinderea claselor




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
var tux = new Animal ("Tux", 17);

tux.toString ()             [object Object]

Animal.prototype.toString = function () {
  return '<animal>' + this.oferaNume () + '</animal>';
};
tux.toString ()             "<animal>Tux</animal>"
Dr. Sabin Buragawww.purl.org/net/busaco
caracteristici: extinderea claselor




                                                     Dr. Sabin Buragawww.purl.org/net/busaco
              Atentie la pericole!

de exemplu, comportamentul diferit al constructiei
             for (var proprietate in obiect)
caracteristici: functii de nivel inalt




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
Deoarece o functie reprezinta un obiect, poate fi:

                stocata intr-o variabila

                pasata unei alte functii

  intoarsa de o functie – fiind argument pentru return
caracteristici: functii de nivel inalt




                                                           Dr. Sabin Buragawww.purl.org/net/busaco
Dorim sa calculam greutatea unui animal,
  dupa formula greutate = marime * 33

                  varianta clasica:

var marimi = [17, 20, 7, 14];
var greutati = [ ];
for (var contor = 0; contor < marimi.length; contor++) {
  greutati[contor] = marimi[contor] * 33;
}
Varianta imbunatatita – mai generala:
function genereazaTablouGreutati (tablou, calcul) {




                                                                   Dr. Sabin Buragawww.purl.org/net/busaco
   var rezultat = [ ];
   for (var contor = 0; contor < tablou.length; contor++) {
     rezultat[contor] = calcul (tablou[contor]);
   }
   return rezultat;
}
function calculGreutate (marime) {
  return marime * 33;
}
var greutati = genereazaTablouGreutati (marimi, calculGreutate);
                                         referim functia
                                      ce va realiza calculul
calcul e variabila
         Varianta imbunatatita –     mai generala:
                                        de tip functie

function genereazaTablouGreutati (tablou, calcul) {




                                                                   Dr. Sabin Buragawww.purl.org/net/busaco
   var rezultat = [ ];
   for (var contor = 0; contor < tablou.length; contor++) {
     rezultat[contor] = calcul (tablou[contor]);
   }                                  fiind functie,
   return rezultat;                  se poate apela
}
function calculGreutate (marime) {
  return marime * 33;
}
var greutati = genereazaTablouGreutati (marimi, calculGreutate);
Dr. Sabin Buragawww.purl.org/net/busaco
caracteristici: incapsulare




                                                       Dr. Sabin Buragawww.purl.org/net/busaco
  JavaScript ofera un singur spatiu de nume,
                la nivel global



conflicte privind denumirea functiilor/variabilelor
         specificate de programe diferite,
       concepute de mai multi dezvoltatori
caracteristici: incapsulare




                                             Dr. Sabin Buragawww.purl.org/net/busaco
Nu trebuie afectat spatiul de nume global,
 pastrându-se codul-sursa la nivel privat
caracteristici: incapsulare




                                                 Dr. Sabin Buragawww.purl.org/net/busaco
     Codul poate fi complet încapsulat
            via functii anonime
care “pastreaza” constructiile la nivel privat
caracteristici: closures




                                                              Dr. Sabin Buragawww.purl.org/net/busaco
Declararea imbricata – ca expresii de tip functie –
  a functiilor anonime are denumirea closures




 https://developer.mozilla.org/en/JavaScript/Guide/Closures
caracteristici: closures




                                                          Dr. Sabin Buragawww.purl.org/net/busaco
// specificarea unei expresii de tip functie
( function () {
   // variabilele & functiile vor fi vizibile doar aici
   // variabilele globale pot fi accesate
} ( ) );
var cod = (function () {              function faCeva (x, y) {
  var n = 0; // variabila privata




                                                                           Dr. Sabin Buragawww.purl.org/net/busaco
                                         // ...
  function start (x) {                }
    // ... poate accesa 'n'           return {
    // si functia 'faCeva'              // sunt publice doar
  }                                     // functiile 'start' si 'faCeva'
  function faAia (param) {              'start': start,
   // ... invizibila din afara          'faCeva': faCeva
}                                     }
                                    }) ();
                                    cod.start (x); // apelam 'start'
var cod = (function () {              function faCeva (x, y) {
  var n = 0; // variabila privata




                                                                           Dr. Sabin Buragawww.purl.org/net/busaco
                                         // ...
  function start (x) {                }
    // ... poate accesa 'n'           return {
    // si functia 'faCeva'              // sunt publice doar
  }                                     // functiile 'start' si 'faCeva'
  function faAia (param) {              'start': start,
   // ... invizibila din afara          'faCeva': faCeva
}                                     }
                                    }) ();
                                    cod.start (x); // apelam 'start'


        via closures, simulam metodele private
       modularizarea codului (module pattern)
var makeCounter = function () {
  var contorPrivat = 0;      // un contor de valori (initial, zero)
  function changeBy (val) { // functie privata
     contorPrivat += val;    // ce modifica valoarea contorului




                                                                             Dr. Sabin Buragawww.purl.org/net/busaco
  }
  return {                   // functii publice (expuse)
     increment: function() {
       changeBy (1);
    },
    decrement: function() {
       changeBy (-1);
    },                           console.log (contor1.value ()); /* 0 */
    value: function() {          contor1.increment ();
       return contorPrivat;      contor1.increment ();
    }
  };                             console.log (contor1.value ()); /* 2 */
};                               contor1.decrement ();
                                   console.log (contor1.value ()); /* 1 */
                                   console.log (contor2.value ()); /* 0 */
Dr. Sabin Buragawww.purl.org/net/busaco
de retinut!




                                                       Dr. Sabin Buragawww.purl.org/net/busaco
Totul in JavaScript este obiect – chiar si functiile
de retinut!




                                          Dr. Sabin Buragawww.purl.org/net/busaco
Orice obiect este intotdeauna mutabil
      (poate fi alterat oricând)



    toate proprietatile si metodele
sunt disponibile oriunde (public scope)
de retinut!




                                                  Dr. Sabin Buragawww.purl.org/net/busaco
Nu exista vizibilitate la nivel de bloc de cod
                (block scope),
ci doar la nivel global ori la nivel de functie
de retinut!




                                                     Dr. Sabin Buragawww.purl.org/net/busaco
Functiile ascund orice e definit in interiorul lor
de retinut!




                                 Dr. Sabin Buragawww.purl.org/net/busaco
Operatorul “.” este echivalent
    cu de-referentierea:

     ob.prop === ob["prop"]
de retinut!




                                             Dr. Sabin Buragawww.purl.org/net/busaco
Operatorul new creeaza obiecte apartinând
 clasei specificate de functia constructor
de retinut!




                                                      Dr. Sabin Buragawww.purl.org/net/busaco
Accesorul this este relativ la contextul executiei,
                 nu al declararii
de retinut!




                                                      Dr. Sabin Buragawww.purl.org/net/busaco
Accesorul this este relativ la contextul executiei,
                 nu al declararii



    Atentie la dependenta
    de mediul de executie!
de retinut!




                                                 Dr. Sabin Buragawww.purl.org/net/busaco
Proprietatea prototype are valori modificabile
json




                             Dr. Sabin Buragawww.purl.org/net/busaco
JavaScript Object Notation




     http://json.org/
json




                                            Dr. Sabin Buragawww.purl.org/net/busaco
       JavaScript Object Notation

format compact pentru interschimb de date
             intre aplicatii
json




                                   Dr. Sabin Buragawww.purl.org/net/busaco
 JavaScript Object Notation

    datele pot fi specificate
in termeni de obiecte & literali
json




                                                             Dr. Sabin Buragawww.purl.org/net/busaco
             JavaScript Object Notation

{
    'nume': 'Tux',                  datele pot fi evaluate
                                     direct in JavaScript
    'stoc': 33,
    'model': [ 'candid', 'furios', 'vesel' ]
}
Dr. Sabin Buragawww.purl.org/net/busaco
exemplu concret: raspuns JSON obtinut in urma unei interogari YQL
instrumente




                                               Dr. Sabin Buragawww.purl.org/net/busaco
Editare de cod & dezvoltare de aplicatii Web
                  Testare
          Documentare a codului
                Compresie
                Optimizare
instrumente: editare




                                                           Dr. Sabin Buragawww.purl.org/net/busaco
                    Pentru desktop:
 Aptana Studio, JS Development Tools (plug-in Eclipse),
    Sublime Text, Visual Studio (Express Edition),…

                  Disponibile pe Web:
             Cloud9 IDE, JS Bin, JS Fiddle etc.


unele ofera si partajarea codului-sursa cu alti dezvoltatori
instrumente: testare




                             Dr. Sabin Buragawww.purl.org/net/busaco
   Verificare statica

 instrumente de referinta:
          JSLint
         JSHint
instrumente: testare




                             Dr. Sabin Buragawww.purl.org/net/busaco
Suport pentru unit testing

      exemplificari:
         Jasmine
       JSTest.NET
          QUnit
         Sinon.js
          Tyrtle
instrumente: documentarea codului




                                                     Dr. Sabin Buragawww.purl.org/net/busaco
Standarde de redactare a codului JavaScript

                   exemple:
    Crock’s Code Conventions for JavaScript
         Google JavaScript Style Guide
                  Idiomatic.js

 ghiduri specifice – e.g., jQuery Core Style Guide
instrumente: documentarea codului




                                           Dr. Sabin Buragawww.purl.org/net/busaco
Software pentru documentarea programelor

              JSDoc Toolkit
               jGrouseDoc
                 YUIDoc
instrumente: compresie de cod




                                                                         Dr. Sabin Buragawww.purl.org/net/busaco
   Instrumente privind compresia/minimizarea

              Online Javascript Compression Tool
                        YUI Compressor
                          Scriptalizer

             detalii in articolul A. Powell,
Understanding Compression and Minification (mai 2012):
www.aaron-powell.com/javascript/understanding-compression-and-minification
instrumente: optimizare javascript




                                               Dr. Sabin Buragawww.purl.org/net/busaco
Transformarea codului JS intr-unul optimizat


            exemplu de referinta:
              Closure Compiler


   https://developers.google.com/closure/
instrumente




                                            Dr. Sabin Buragawww.purl.org/net/busaco
Facilitarea dezvoltarii de aplicatii Web
la nivel de client similare celor desktop

          exemplificari notabile:
   Cappuccino – http://cappuccino.org/
SproutCore – http://www.sproutcore.com/
instrumente




                                                         Dr. Sabin Buragawww.purl.org/net/busaco
Alte limbaje pentru dezvoltarea de aplicatii Web

        CoffeeScript (Jeremy Ashkenas, 2009)
              http://coffeescript.org/
            TypeScript (Microsoft, 2012)
         http://www.typescriptlang.org/


limbaje de programare care se compileaza in JavaScript
instrumente




                                               Dr. Sabin Buragawww.purl.org/net/busaco
   Portarea altor aplicatii in JavaScript

Emscripten – compilator LLVM generand cod JS
  (e.g., programe C/C++, Lua, Python, Ruby
         ce se pot compila in JavaScript)

          http://emscripten.org/
instrumente




                                                        Dr. Sabin Buragawww.purl.org/net/busaco
      Portarea altor aplicatii in JavaScript

   JSIL – compilator care transforma aplicatiile .NET
in programe JavaScript ruland independent de browser

                  http://jsil.org/
?



Dr. Sabin Buragawww.purl.org/net/busaco

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
 
CLIW 2015-2016 (12/13) Performanța aplicaţiilor Web la nivel de client
CLIW 2015-2016 (12/13) Performanța aplicaţiilor Web la nivel de clientCLIW 2015-2016 (12/13) Performanța aplicaţiilor Web la nivel de client
CLIW 2015-2016 (12/13) Performanța aplicaţiilor Web la nivel de client
 
CLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţiale
CLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţialeCLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţiale
CLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţiale
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...
 
CLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScript
CLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScriptCLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScript
CLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScript
 
CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...
CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...
CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...
 
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţialeSTAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
 
CLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScriptCLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScript
 
CLIW 2014—2015 (7/12): Programare în limbajul JavaScript
CLIW 2014—2015 (7/12): Programare în limbajul JavaScriptCLIW 2014—2015 (7/12): Programare în limbajul JavaScript
CLIW 2014—2015 (7/12): Programare în limbajul JavaScript
 
Un mini-tutorial JavaScript
Un mini-tutorial JavaScriptUn mini-tutorial JavaScript
Un mini-tutorial JavaScript
 
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....
 
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
 
CLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansamblu
CLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansambluCLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansamblu
CLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansamblu
 
HTML5 în XXX de minute
HTML5 în XXX de minuteHTML5 în XXX de minute
HTML5 în XXX de minute
 
Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...
Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...
Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...
 
Web 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.js
Web 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.jsWeb 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.js
Web 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.js
 
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
 
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
 
Web 2016 (04/13) Programare Web – Dezvoltarea aplicațiilor Web în PHP
Web 2016 (04/13) Programare Web – Dezvoltarea aplicațiilor Web în PHPWeb 2016 (04/13) Programare Web – Dezvoltarea aplicațiilor Web în PHP
Web 2016 (04/13) Programare Web – Dezvoltarea aplicațiilor Web în PHP
 

Ähnlich wie Limbajul JavaScript: o prezentare generală

Ähnlich wie Limbajul JavaScript: o prezentare generală (20)

Dezvoltarea aplicaţiilor Web la nivel de client (cursul #10): Ingineria dezvo...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #10): Ingineria dezvo...Dezvoltarea aplicaţiilor Web la nivel de client (cursul #10): Ingineria dezvo...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #10): Ingineria dezvo...
 
Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...
Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...
Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #6): Căutarea resurse...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #6): Căutarea resurse...Dezvoltarea aplicaţiilor Web la nivel de client (cursul #6): Căutarea resurse...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #6): Căutarea resurse...
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #4): Design Web. Proi...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #4): Design Web. Proi...Dezvoltarea aplicaţiilor Web la nivel de client (cursul #4): Design Web. Proi...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #4): Design Web. Proi...
 
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScriptSTAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
 
Dezvoltarea aplicațiilor Web (1/12): Dezvoltarea de aplicaţii Web: Concepte &...
Dezvoltarea aplicațiilor Web (1/12): Dezvoltarea de aplicaţii Web: Concepte &...Dezvoltarea aplicațiilor Web (1/12): Dezvoltarea de aplicaţii Web: Concepte &...
Dezvoltarea aplicațiilor Web (1/12): Dezvoltarea de aplicaţii Web: Concepte &...
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #2): Arhitectura navi...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #2): Arhitectura navi...Dezvoltarea aplicaţiilor Web la nivel de client (cursul #2): Arhitectura navi...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #2): Arhitectura navi...
 
Ce înseamnă să fii dezvoltator Web
Ce înseamnă să fii dezvoltator WebCe înseamnă să fii dezvoltator Web
Ce înseamnă să fii dezvoltator Web
 
STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...
STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...
STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...
 
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul RESTDezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
Dezvoltarea aplicațiilor Web (2/12): Dezvoltarea de servicii Web în stilul REST
 
CLIW 2017-2018 (3/12) (Re)găsirea resurselor Web. De la motoare de căutare şi...
CLIW 2017-2018 (3/12) (Re)găsirea resurselor Web. De la motoare de căutare şi...CLIW 2017-2018 (3/12) (Re)găsirea resurselor Web. De la motoare de căutare şi...
CLIW 2017-2018 (3/12) (Re)găsirea resurselor Web. De la motoare de căutare şi...
 
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
Dezvoltarea aplicatiilor orientate spre servicii Web. De la REST la mash-up-u...
 
Suita de tehnologii HTML5
Suita de tehnologii HTML5Suita de tehnologii HTML5
Suita de tehnologii HTML5
 
CLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScriptCLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScript
 
CLIW 2014—2015 (4/12): Design Web. Proiectarea siturilor Web. Design Web resp...
CLIW 2014—2015 (4/12): Design Web. Proiectarea siturilor Web. Design Web resp...CLIW 2014—2015 (4/12): Design Web. Proiectarea siturilor Web. Design Web resp...
CLIW 2014—2015 (4/12): Design Web. Proiectarea siturilor Web. Design Web resp...
 
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
WADe 2017-2018 (5/12) Data Modeling in RDF (Resource Description Framework)
 
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uriSTAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
 
Web 2016 (06/13) Modelarea datelor. Familia XML + spații de nume
Web 2016 (06/13) Modelarea datelor. Familia XML + spații de numeWeb 2016 (06/13) Modelarea datelor. Familia XML + spații de nume
Web 2016 (06/13) Modelarea datelor. Familia XML + spații de nume
 
Dezvoltarea aplicațiilor Web (5/12): Modelul RDF (Resource Description Framew...
Dezvoltarea aplicațiilor Web (5/12): Modelul RDF (Resource Description Framew...Dezvoltarea aplicațiilor Web (5/12): Modelul RDF (Resource Description Framew...
Dezvoltarea aplicațiilor Web (5/12): Modelul RDF (Resource Description Framew...
 
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni WebWeb 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
 

Mehr von Sabin Buraga

Mehr von Sabin Buraga (20)

Web 2020 01/12: World Wide Web – aspecte arhitecturale
Web 2020 01/12: World Wide Web – aspecte arhitecturaleWeb 2020 01/12: World Wide Web – aspecte arhitecturale
Web 2020 01/12: World Wide Web – aspecte arhitecturale
 
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie WebWeb 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
 
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
 
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object ModelWeb 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
 
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
 
Web 2020 09/12: Servicii Web. Paradigma REST
Web 2020 09/12: Servicii Web. Paradigma RESTWeb 2020 09/12: Servicii Web. Paradigma REST
Web 2020 09/12: Servicii Web. Paradigma REST
 
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
 
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţialeWeb 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
 
STAW 01/12: Arhitectura aplicaţiilor Web
STAW 01/12: Arhitectura aplicaţiilor WebSTAW 01/12: Arhitectura aplicaţiilor Web
STAW 01/12: Arhitectura aplicaţiilor Web
 
STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.
STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.
STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.
 
STAW 04/12: Programare Web: Node.js
STAW 04/12: Programare Web: Node.jsSTAW 04/12: Programare Web: Node.js
STAW 04/12: Programare Web: Node.js
 
STAW 05/12: Arhitectura navigatorului Web
STAW 05/12: Arhitectura navigatorului WebSTAW 05/12: Arhitectura navigatorului Web
STAW 05/12: Arhitectura navigatorului Web
 
STAW 08/12: Programare Web. Suita de tehnologii HTML5
STAW 08/12: Programare Web. Suita de tehnologii HTML5STAW 08/12: Programare Web. Suita de tehnologii HTML5
STAW 08/12: Programare Web. Suita de tehnologii HTML5
 
STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)
STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)
STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)
 
STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)
STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)
STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)
 
STAW 11/12: Performanţa aplicaţiilor Web la nivel de client
STAW 11/12: Performanţa aplicaţiilor Web la nivel de clientSTAW 11/12: Performanţa aplicaţiilor Web la nivel de client
STAW 11/12: Performanţa aplicaţiilor Web la nivel de client
 
Sabin Buraga: Dezvoltator Web?! (2019)
Sabin Buraga: Dezvoltator Web?! (2019)Sabin Buraga: Dezvoltator Web?! (2019)
Sabin Buraga: Dezvoltator Web?! (2019)
 
HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...
HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...
HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...
 
HCI 2018 (3/10) Design Models, Methodologies and Guidelines
HCI 2018 (3/10) Design Models, Methodologies and GuidelinesHCI 2018 (3/10) Design Models, Methodologies and Guidelines
HCI 2018 (3/10) Design Models, Methodologies and Guidelines
 
HCI 2018 (4/10) Information Architecture. From Design Patterns to Visual Design
HCI 2018 (4/10) Information Architecture. From Design Patterns to Visual DesignHCI 2018 (4/10) Information Architecture. From Design Patterns to Visual Design
HCI 2018 (4/10) Information Architecture. From Design Patterns to Visual Design
 

Limbajul JavaScript: o prezentare generală

  • 1. Tehnologii Web Dr. Sabin Buragawww.purl.org/net/busaco Programare Web – supliment o prezentare generala a limbajului JavaScript
  • 2. Dr. Sabin Buragawww.purl.org/net/busaco “Un arcas bun atinge tinta chiar inainte de a trage.” Ch’Ao Pu-Che
  • 3. istoric Dr. Sabin Buragawww.purl.org/net/busaco Inventat de Brendan Eich (1995) denumit initial LiveScript
  • 4. istoric Dr. Sabin Buragawww.purl.org/net/busaco Implementat in premiera de browser-ul Netscape Navigator
  • 5. istoric Dr. Sabin Buragawww.purl.org/net/busaco Adaptat de Microsoft: JScript (1996)
  • 6. istoric Dr. Sabin Buragawww.purl.org/net/busaco Standardizat in 1997 de ECMA European Computer Manufacturers Association ECMAScript ECMA-262 www.ecma-international.org
  • 7. istoric Dr. Sabin Buragawww.purl.org/net/busaco Standardizat in 1997 de ECMA European Computer Manufacturers Association ECMAScript versiunea standardizata actuala: 5.1 (iunie 2011) versiunea in lucru: 6.0 (în curând) www.ecma-international.org/publications/standards/Ecma-262.htm
  • 8. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Limbaj de tip script (interpretat)
  • 9. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Limbaj de tip script (interpretat) destinat sa manipuleze, sa automatizeze si sa integreze facilitatile oferite de un anumit sistem
  • 10. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Limbaj de tip script (interpretat) nu necesita intrari/iesiri in mod implicit
  • 11. Dr. Sabin Buragawww.purl.org/net/busaco Cum putem executa programele JavaScript?
  • 12. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) navigator Web permite rularea de aplicatii Web la nivelul unei platforme (un sistem de operare) desktop (e.g., Windows 8) mobil (Android, iOS, WP7, WP8) …
  • 13. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) navigator Web “injectarea” de cod JavaScript in documentele (X)HTML via elementul <script>
  • 14. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) navigator Web “injectarea” de cod JavaScript in documentele (X)HTML via elementul <script> cod extern vs. cod inclus in pagina Web
  • 15. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) platforma de dezvoltare a aplicatiilor e.g., Flex/AIR
  • 16. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) software de sine-statator Adobe Creative Suite, UltraEdit etc.
  • 17. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) procesor (engine) independent exemplificare: Yahoo! Widget Engine
  • 18. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) componente ale sistemului de operare Dashboard – Mac OS X Sidebar – Windows Vista/7
  • 19. caracteristici Dr. Sabin Buragawww.purl.org/net/busaco Mediu de executie (host-environment) server Web exemplu tipic: node.js
  • 20. caracteristici: sintaxa Dr. Sabin Buragawww.purl.org/net/busaco Cuvinte rezervate: break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof
  • 21. caracteristici: sintaxa Dr. Sabin Buragawww.purl.org/net/busaco Alte cuvinte rezervate: abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public
  • 22. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Number reprezentare in dubla precizie stocare pe 64 biti
  • 23. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco String secvente de caractere Unicode fiecare caracter ocupa 16 biti
  • 24. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Boolean secvente ce se pot evalua ca fiind true/false
  • 25. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Object Function Array Date RegExp si altele
  • 26. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Null semnifica “nici o valoare”
  • 27. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Undefined are semnificatia “nici o valoare asignata inca”
  • 28. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Nu exista valori intregi
  • 29. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Nu exista valori intregi convertirea unui sir in numar: parseInt () parseInt ("123")  123 parseInt ("11", 2)  3 indica baza de numeratie
  • 30. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Operatii avansate cu numere se pot realiza via obiectul predefinit Math
  • 31. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Operatii avansate cu numere se pot realiza via obiectul predefinit Math constante predefinite: Math.PI Math.E Math.LN10 etc.
  • 32. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Operatii avansate cu numere se pot realiza via obiectul predefinit Math metode: Math.abs(x) Math.ceil(x) Math.cos(x) Math.exp(x) Math.floor(x) Math.log(x) Math.max(x, ..) Math.min(x, ..) Math.pow(x, y) Math.random() Math.round(x) Math.sin(x) Math.sqrt(x) etc.
  • 33. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco “Valoarea” NaN (“not a number”) parseInt ("Salut")  NaN isNaN (NaN + 3)  true
  • 34. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Valori speciale: Infinity –Infinity
  • 35. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Un caracter reprezinta un sir de lungime 1
  • 36. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Sirurile sunt obiecte "Salut".length  5
  • 37. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Metode pentru siruri: s.charAt(pos) s.charCodeAt(pos) s.concat(s1, ..) s.indexOf(s1, start) s.match(regexp) s.replace(search, replace) s.slice(start, end) s.split(separator, limit) s.substring(start, end) s.toLowerCase() s.toUpperCase() etc.
  • 38. caracteristici: tipuri de date Dr. Sabin Buragawww.purl.org/net/busaco Valorile 0, "", NaN, null, undefined sunt interpretate ca fiind false !!234  true
  • 39. caracteristici: variabile Dr. Sabin Buragawww.purl.org/net/busaco Variabilele se declara cu var var marime; var numeAnimal = "Tux"; variabilele declarate fara valori asignate, se considera undefined
  • 40. caracteristici: variabile Dr. Sabin Buragawww.purl.org/net/busaco Daca nu se foloseste var, atunci variabila este considerata globala de evitat asa ceva!
  • 41. caracteristici: variabile Dr. Sabin Buragawww.purl.org/net/busaco Valorile sunt “legate” tardiv la variabile (late binding)
  • 42. caracteristici: variabile Dr. Sabin Buragawww.purl.org/net/busaco Mai nou, exista posibilitatea marginirii domeniului de vizibilitate (scope) via let var x = 5; var y = 0; console.log (let (x = x + 10, y = 12) x + y); // 27 console.log (x + y); // 5
  • 43. caracteristici: operatori Dr. Sabin Buragawww.purl.org/net/busaco Pentru numere: + – * / % De asignare: += –= *= /= %= Incrementare & decrementare: ++ – – Concatenare de siruri: "Java" + "Script"  "JavaScript"
  • 44. caracteristici: operatori Dr. Sabin Buragawww.purl.org/net/busaco Conversia tipurilor se face “din zbor” "3" + 4 + 5  345 3 + 4 + "5"  75 adaugând un sir vid la o expresie, o convertim pe aceasta la string
  • 45. caracteristici: operatori Dr. Sabin Buragawww.purl.org/net/busaco Comparatii: < > <= >= (numere & siruri) egalitatea se testeaza cu == si != 1 == true  true
  • 46. caracteristici: operatori Dr. Sabin Buragawww.purl.org/net/busaco Comparatii: < > <= >= (numere & siruri) egalitatea se testeaza cu == si != 1 == true  true a se folosi: 1 === true  false inhiba conversia tipurilor de date
  • 47. caracteristici: operatori Dr. Sabin Buragawww.purl.org/net/busaco Aflarea tipului unei expresii: operatorul typeof typeof "Tux"  string
  • 48. caracteristici: operatori Dr. Sabin Buragawww.purl.org/net/busaco Operatorii logici && si || var nume = unNume || "Implicit";
  • 49. caracteristici: operatori Dr. Sabin Buragawww.purl.org/net/busaco Operatorul de test ? : var prezenta = (studenti > 33) ? "Prea multi" : "Cam putini…";
  • 50. caracteristici: control Dr. Sabin Buragawww.purl.org/net/busaco Testare: if … else, switch pentru switch, sunt permise expresii la fiecare case (testarea se realizeaza cu operatorul ===) switch (2 + 3) { /* sunt permise expresii */ case 4 + 1 : egalitate (); break; default : absurd (); // nu se apeleaza niciodata }
  • 51. caracteristici: control Dr. Sabin Buragawww.purl.org/net/busaco Ciclare: while, do … while, for do { var nume = preiaNume (); } while (nume != ""); for (var contor = 0; contor < 33; contor++) { // de 33 de ori… }
  • 52. caracteristici: control Dr. Sabin Buragawww.purl.org/net/busaco Exceptii: try … catch … finally try { // Linii "periculoase" ce pot cauza exceptii } catch (eroare) { // Linii executate la aparitia unei/unor exceptii } finally { // Linii care se vor executa la final }
  • 53. caracteristici: control Dr. Sabin Buragawww.purl.org/net/busaco Exceptii: try … catch … finally try { // Linii "periculoase" ce pot cauza exceptii } catch (eroare) { // Linii executate la aparitia unei/unor exceptii } finally { // Linii care se vor executa la final } emiterea unei exceptii: throw throw new Error ("O eroare de-a noastra!...");
  • 54. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Perechi nume—valoare
  • 55. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Perechi nume—valoare tabele de dispersie (hash) in C/C++ tablouri asociative in Perl, PHP sau Ruby HashMaps in Java
  • 56. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Perechi nume—valoare numele este desemnat de un sir de caractere valoarea poate fi de orice tip
  • 57. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Obiect  colectie de proprietati, avand mai multe atribute proprietatile pot contine alte obiecte, valori primitive sau metode
  • 58. caracteristici: obiecte predefinite Dr. Sabin Buragawww.purl.org/net/busaco Global Object Function Array String Boolean Number Math Date Regex
  • 59. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Create prin intermediul operatorului new: var ob = new Object(); var ob = { }; // echivalent cu linia anterioara
  • 60. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Create prin intermediul operatorului new: var ob = new Object(); var ob = { }; // echivalent cu linia anterioara se prefera aceasta sintaxa
  • 61. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Accesarea proprietatilor – operatorul . ob.nume = "Tux"; var nume = ob.nume;
  • 62. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Accesarea proprietatilor: ob.nume = "Tux"; var nume = ob.nume; echivalent cu: ob["nume"] = "Tux"; var nume = ob["nume"];
  • 63. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Declarare + asignare: var pinguin = { nume: "Tux", proprietati: { culoare: "verde", marime: 17 } }
  • 64. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Accesare: pinguin.proprietati.marime  17 pinguin["proprietati"]["culoare"]  verde
  • 65. caracteristici: obiecte Dr. Sabin Buragawww.purl.org/net/busaco Iterarea proprietatilor – considerate chei: var pinguin = { 'nume': 'Tux', 'marime': 17 }; for (var proprietate in pinguin) { afiseaza (proprietate + ' = ' + pinguin[proprietate]); }
  • 66. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Tipuri speciale de obiecte proprietatile (cheile) sunt numere, nu siruri de caractere
  • 67. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Se poate utiliza sintaxa de la obiecte: var animale = new Array (); animale[0] = "pinguin"; animale[1] = "omida"; animale[2] = "pterodactil"; animale.length  3
  • 68. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Se poate utiliza sintaxa de la obiecte: var animale = new Array (); animale[0] = "pinguin"; animale[1] = "omida"; animale[2] = "pterodactil"; animale.length  3 notatie alternativa – preferata: var animale = ["pinguin", "omida", "pterodactil"];
  • 69. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Tablourile pot avea “gauri” (sparse arrays): var animale = ["pinguin", "omida", "pterodactil"]; animale[33] = "om"; animale.length  34 typeof animale[13]  undefined
  • 70. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Tablourile pot avea “gauri” (sparse arrays): var animale = ["pinguin", "omida", "pterodactil"]; animale[33] = "om"; animale.length  34 typeof animale[13]  undefined pentru a adauga elemente putem recurge la: animale[animale.length] = altAnimal;
  • 71. caracteristici: tablouri – exemplu Dr. Sabin Buragawww.purl.org/net/busaco var vector = [ ]; vector[0] = "zero"; vector[new Date().getTime()] = "now"; vector[3.14] = "pi"; for (var elem in vector) { console.log ("vector[" + elem + "] = " + vector[elem] + ", typeof( " + elem +") == " + typeof (elem)); } adaptare dupa John Kugelman (2009)
  • 72. Dr. Sabin Buragawww.purl.org/net/busaco rezultatul obtinut in urma rularii programului JavaScript via JS Bin
  • 73. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Interari: for (var it = 0; it < animale.length; it++) { // de prelucrat animale[it] }
  • 74. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Interari: for (var it = 0; it < animale.length; it++) { // de prelucrat animale[it] } de ce? // varianta mai buna for (var it = 0, lung = animale.length; it < lung; it++) { // de prelucrat animale[it] }
  • 75. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Elementele pot apartine unor tipuri de date eterogene var animale = [33, "vierme", false, "gaga"];
  • 76. caracteristici: tablouri Dr. Sabin Buragawww.purl.org/net/busaco Metode utile: a.toString() a.concat(item, ..) a.join(sep) a.pop() a.push(item, ..) a.reverse() a.shift() a.unshift([item]..) a.sort(cmpfn) a.splice(start, delcount, [item]..) etc.
  • 77. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco Definite via function function transformaPixeliInPuncte (px) { var puncte = px * 300; return puncte; }
  • 78. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco Daca nu este intors nimic in mod explicit, valoarea de retur se considera undefined
  • 79. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco Parametrii pot lipsi, fiind considerati undefined
  • 80. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco Pot fi transmise mai multe argumente, cele in surplus fiind ignorate transformaPixeliInPuncte (10, 7)  3000
  • 81. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco Argumentele primite de o functie se acceseaza via tabloul arguments: function aduna () { var suma = 0; for (var i = 0, j = arguments.length; i < j; i++) { suma += arguments[i]; } return suma; }
  • 82. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco Functiile sunt tot obiecte astfel, pot fi specificate functii anonime expresii lambda
  • 83. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco Functiile sunt tot obiecte astfel, pot fi specificate functii anonime expresii lambda in acest sens, JavaScript este un limbaj functional
  • 84. caracteristici: functii Dr. Sabin Buragawww.purl.org/net/busaco var media = function () { // calculul mediei a N numere var suma = 0; for (var iter = 0, lung = arguments.length; iter < lung; iter++) { suma += arguments[iter]; } return suma / arguments.length; };
  • 86. Dr. Sabin Buragawww.purl.org/net/busaco precizati ce efect vor avea liniile de cod urmatoare: console.log ( typeof (media) ); console.log ( media() );
  • 87. Dr. Sabin Buragawww.purl.org/net/busaco variabila media este de tip function apelul media() intoarce valoarea NaN
  • 88. functii recursive in JavaScript /* determina numarul caracterelor din nodurile text Dr. Sabin Buragawww.purl.org/net/busaco ale arborelui DOM-ului asociat unui document */ function numaraCaractereDinNoduriText (element) { if (element.nodeType == 3) { // nod text (din DOM) return element.nodeValue.length; } var contor = 0; // recursiv, numaram caracterele fiecarui nod copil // al arborelui DOM cu radacina ‘element’ for (var it = 0, copil; copil = element.childNodes[it]; it++) { contor += numaraCaractereDinNoduriText (copil); } vezi cele return contor; discutate la DOM }
  • 89. Dr. Sabin Buragawww.purl.org/net/busaco // varianta folosind functii anonime var nrCaractDoc = (function (element) { if (element.nodeType == 3) { // nod text return element.nodeValue.length; } var contor = 0; for (var it = 0, copil; copil = element.childNodes[it]; it++) { contor += arguments.callee (copil); } return contor; furnizeaza care-i functia apelanta }) (xml.root);
  • 90. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco Exemplificare: dorim sa procesam – via functii – caracteristici ale unor animale
  • 91. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco function creeazaAnimal (nume, marime) { return { nume: nume, marime: marime } } function oferaNume (animal) { return animal.nume; } function oferaMarime (animal) { return animal.marime; }
  • 92. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco function creeazaAnimal (nume, marime) { return { nume: nume, marime: marime } } function oferaNume (animal) { return animal.nume; } function oferaMarime (animal) { return animal.marime; } var tux = creeazaAnimal ("Tux", 17); oferaMarime (tux)  17
  • 93. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco O “clasa” referitoare la animale: function creeazaAnimal (nume, marime) { return { nume: nume, // date-membre marime: marime, oferaNume: function () { // metoda return animal.nume; }, oferaMarime: function () { // metoda return animal.marime; } }
  • 94. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco Apelarea metodelor definite: var tux = creeazaAnimal ("Tux", 17); tux.oferaMarime()  17
  • 95. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco Apelind insa o functie fara notatia cu “.”, nu obtinem rezultatul scontat: var marimea = tux.oferaMarimea; oferaMarimea ()  undefined
  • 96. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco Apelind insa o functie fara notatia cu “.”, nu obtinem rezultatul scontat: var marimea = tux.oferaMarimea; oferaMarimea ()  undefined obiectul curent (“this”) este setat ca fiind obiectul global (in browser, reprezinta fereastra curenta in care este redat documentul: this  window)
  • 97. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco function Animal (nume, marime) { this.nume = nume; // date-membre this.marime = marime; this.oferaNume = function () { // metoda return this.nume; }; this.oferaMarime = function () { // metoda return this.marime; }; } creational pattern
  • 98. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco clase – utilizarea constructorilor function Animal (nume, marime) { this.nume = nume; // date-membre this.marime = marime; this.oferaNume = function () { // metoda return this.nume; }; this.oferaMarime = function () { // metoda return this.marime; }; }
  • 99. caracteristici: de la functii la clase Dr. Sabin Buragawww.purl.org/net/busaco clase – utilizarea constructorilor function Animal (nume, marime) { this.nume = nume; // date-membre this.marime = marime; this.oferaNume = function () { // metoda return this.nume; }; this.oferaMarime = function () { // metoda return this.marime; }; } var tux = new Animal ("Tux", 17); // instantierea unui obiect
  • 100. caracteristici: functii & obiecte Dr. Sabin Buragawww.purl.org/net/busaco Operatorul new creaza un nou obiect vid si apeleaza functia specificata cu this setat pe acest obiect aceste functii se numesc constructori, trebuie apelate via new si, prin conventie, au numele scris cu litera mare
  • 101. caracteristici: functii & obiecte Dr. Sabin Buragawww.purl.org/net/busaco Metodele pot fi declarate si in exteriorul constructorului function oferaNumeAnimal () { return this.nume; } function Animal (nume, marime) { this.nume = nume; this.marime = marime; this.oferaNume = oferaNumeAnimal; }
  • 102. caracteristici: prototipuri Dr. Sabin Buragawww.purl.org/net/busaco Structura unei clase poate fi extinsa ulterior, folosind proprietatea prototype
  • 103. caracteristici: prototipuri Dr. Sabin Buragawww.purl.org/net/busaco Structura unei clase poate fi extinsa ulterior, folosind proprietatea prototype un prototip e o proprietate oferind o legatura ascunsa
  • 104. caracteristici: prototipuri Dr. Sabin Buragawww.purl.org/net/busaco Structura unei clase poate fi extinsa ulterior, folosind proprietatea prototype daca se incearca accesarea unui element inexistent in cadrul unui obiect dat, se va verifica lantul de prototipuri (prototype chain)
  • 105. caracteristici: prototipuri Dr. Sabin Buragawww.purl.org/net/busaco ObjB.prototype = new ObjA ( ); ObjA this.initA ( ) ObjC.prototype = new ObjB ( ); ObjB this.initB ( ) ObjC var test = new objC ( ) this.initC ( ) test.initA ( ); dupa Subramanyan Murali, “JavaScript Design Patterns”, 2008
  • 106. caracteristici: prototipuri Dr. Sabin Buragawww.purl.org/net/busaco function Animal (nume, marime) { // definitie initiala this.nume = nume; this.marime = marime; } Animal.prototype.oferaNume = function() { return this.nume; }; Animal.prototype.oferaMarime = function() { return this.marime; };
  • 107. caracteristici: prototipuri Dr. Sabin Buragawww.purl.org/net/busaco Pentru a cunoaste tipul unui obiect (pe baza constructorului si a ierarhiei de prototipuri) se foloseste operatorul instanceof
  • 108. caracteristici: prototipuri Dr. Sabin Buragawww.purl.org/net/busaco var marimi = [17, 20, 7, 14]; marimi instanceof Array  true marimi instanceof Object  true marimi instanceof String  false var tux = new Animal ("Tux", 17); tux instanceof Object  true tux instanceof Array  false
  • 109. caracteristici: extinderea claselor Dr. Sabin Buragawww.purl.org/net/busaco Adaugarea unei metode se realizeaza via prototype Animal.prototype.oferaNumeMare = function () { return this.nume.toUpperCase (); }; tux.oferaNumeMare ()  "TUX"
  • 110. caracteristici: extinderea claselor Dr. Sabin Buragawww.purl.org/net/busaco Pot fi extinse si obiectele predefinite: // adaugam o metoda obiectului String String.prototype.inverseaza = function () { var inv = ''; for (var iter = this.length - 1; iter >= 0; iter--) { // inversam sirul… inv += this[iter]; } return inv; }; "Web".inverseaza ()  "beW"
  • 111. caracteristici: extinderea claselor Dr. Sabin Buragawww.purl.org/net/busaco Cel mai general prototype este cel al lui Object Una dintre metodele disponibile este toString() care poate fi supra-scrisa (over-ride)
  • 112. caracteristici: extinderea claselor Dr. Sabin Buragawww.purl.org/net/busaco var tux = new Animal ("Tux", 17); tux.toString ()  [object Object] Animal.prototype.toString = function () { return '<animal>' + this.oferaNume () + '</animal>'; }; tux.toString ()  "<animal>Tux</animal>"
  • 114. caracteristici: extinderea claselor Dr. Sabin Buragawww.purl.org/net/busaco Atentie la pericole! de exemplu, comportamentul diferit al constructiei for (var proprietate in obiect)
  • 115. caracteristici: functii de nivel inalt Dr. Sabin Buragawww.purl.org/net/busaco Deoarece o functie reprezinta un obiect, poate fi: stocata intr-o variabila pasata unei alte functii intoarsa de o functie – fiind argument pentru return
  • 116. caracteristici: functii de nivel inalt Dr. Sabin Buragawww.purl.org/net/busaco Dorim sa calculam greutatea unui animal, dupa formula greutate = marime * 33 varianta clasica: var marimi = [17, 20, 7, 14]; var greutati = [ ]; for (var contor = 0; contor < marimi.length; contor++) { greutati[contor] = marimi[contor] * 33; }
  • 117. Varianta imbunatatita – mai generala: function genereazaTablouGreutati (tablou, calcul) { Dr. Sabin Buragawww.purl.org/net/busaco var rezultat = [ ]; for (var contor = 0; contor < tablou.length; contor++) { rezultat[contor] = calcul (tablou[contor]); } return rezultat; } function calculGreutate (marime) { return marime * 33; } var greutati = genereazaTablouGreutati (marimi, calculGreutate); referim functia ce va realiza calculul
  • 118. calcul e variabila Varianta imbunatatita – mai generala: de tip functie function genereazaTablouGreutati (tablou, calcul) { Dr. Sabin Buragawww.purl.org/net/busaco var rezultat = [ ]; for (var contor = 0; contor < tablou.length; contor++) { rezultat[contor] = calcul (tablou[contor]); } fiind functie, return rezultat; se poate apela } function calculGreutate (marime) { return marime * 33; } var greutati = genereazaTablouGreutati (marimi, calculGreutate);
  • 120. caracteristici: incapsulare Dr. Sabin Buragawww.purl.org/net/busaco JavaScript ofera un singur spatiu de nume, la nivel global conflicte privind denumirea functiilor/variabilelor specificate de programe diferite, concepute de mai multi dezvoltatori
  • 121. caracteristici: incapsulare Dr. Sabin Buragawww.purl.org/net/busaco Nu trebuie afectat spatiul de nume global, pastrându-se codul-sursa la nivel privat
  • 122. caracteristici: incapsulare Dr. Sabin Buragawww.purl.org/net/busaco Codul poate fi complet încapsulat via functii anonime care “pastreaza” constructiile la nivel privat
  • 123. caracteristici: closures Dr. Sabin Buragawww.purl.org/net/busaco Declararea imbricata – ca expresii de tip functie – a functiilor anonime are denumirea closures https://developer.mozilla.org/en/JavaScript/Guide/Closures
  • 124. caracteristici: closures Dr. Sabin Buragawww.purl.org/net/busaco // specificarea unei expresii de tip functie ( function () { // variabilele & functiile vor fi vizibile doar aici // variabilele globale pot fi accesate } ( ) );
  • 125. var cod = (function () { function faCeva (x, y) { var n = 0; // variabila privata Dr. Sabin Buragawww.purl.org/net/busaco // ... function start (x) { } // ... poate accesa 'n' return { // si functia 'faCeva' // sunt publice doar } // functiile 'start' si 'faCeva' function faAia (param) { 'start': start, // ... invizibila din afara 'faCeva': faCeva } } }) (); cod.start (x); // apelam 'start'
  • 126. var cod = (function () { function faCeva (x, y) { var n = 0; // variabila privata Dr. Sabin Buragawww.purl.org/net/busaco // ... function start (x) { } // ... poate accesa 'n' return { // si functia 'faCeva' // sunt publice doar } // functiile 'start' si 'faCeva' function faAia (param) { 'start': start, // ... invizibila din afara 'faCeva': faCeva } } }) (); cod.start (x); // apelam 'start' via closures, simulam metodele private modularizarea codului (module pattern)
  • 127. var makeCounter = function () { var contorPrivat = 0; // un contor de valori (initial, zero) function changeBy (val) { // functie privata contorPrivat += val; // ce modifica valoarea contorului Dr. Sabin Buragawww.purl.org/net/busaco } return { // functii publice (expuse) increment: function() { changeBy (1); }, decrement: function() { changeBy (-1); }, console.log (contor1.value ()); /* 0 */ value: function() { contor1.increment (); return contorPrivat; contor1.increment (); } }; console.log (contor1.value ()); /* 2 */ }; contor1.decrement (); console.log (contor1.value ()); /* 1 */ console.log (contor2.value ()); /* 0 */
  • 129. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Totul in JavaScript este obiect – chiar si functiile
  • 130. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Orice obiect este intotdeauna mutabil (poate fi alterat oricând) toate proprietatile si metodele sunt disponibile oriunde (public scope)
  • 131. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Nu exista vizibilitate la nivel de bloc de cod (block scope), ci doar la nivel global ori la nivel de functie
  • 132. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Functiile ascund orice e definit in interiorul lor
  • 133. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Operatorul “.” este echivalent cu de-referentierea: ob.prop === ob["prop"]
  • 134. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Operatorul new creeaza obiecte apartinând clasei specificate de functia constructor
  • 135. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Accesorul this este relativ la contextul executiei, nu al declararii
  • 136. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Accesorul this este relativ la contextul executiei, nu al declararii Atentie la dependenta de mediul de executie!
  • 137. de retinut! Dr. Sabin Buragawww.purl.org/net/busaco Proprietatea prototype are valori modificabile
  • 138. json Dr. Sabin Buragawww.purl.org/net/busaco JavaScript Object Notation http://json.org/
  • 139. json Dr. Sabin Buragawww.purl.org/net/busaco JavaScript Object Notation format compact pentru interschimb de date intre aplicatii
  • 140. json Dr. Sabin Buragawww.purl.org/net/busaco JavaScript Object Notation datele pot fi specificate in termeni de obiecte & literali
  • 141. json Dr. Sabin Buragawww.purl.org/net/busaco JavaScript Object Notation { 'nume': 'Tux', datele pot fi evaluate direct in JavaScript 'stoc': 33, 'model': [ 'candid', 'furios', 'vesel' ] }
  • 142. Dr. Sabin Buragawww.purl.org/net/busaco exemplu concret: raspuns JSON obtinut in urma unei interogari YQL
  • 143. instrumente Dr. Sabin Buragawww.purl.org/net/busaco Editare de cod & dezvoltare de aplicatii Web Testare Documentare a codului Compresie Optimizare
  • 144. instrumente: editare Dr. Sabin Buragawww.purl.org/net/busaco Pentru desktop: Aptana Studio, JS Development Tools (plug-in Eclipse), Sublime Text, Visual Studio (Express Edition),… Disponibile pe Web: Cloud9 IDE, JS Bin, JS Fiddle etc. unele ofera si partajarea codului-sursa cu alti dezvoltatori
  • 145. instrumente: testare Dr. Sabin Buragawww.purl.org/net/busaco Verificare statica instrumente de referinta: JSLint JSHint
  • 146. instrumente: testare Dr. Sabin Buragawww.purl.org/net/busaco Suport pentru unit testing exemplificari: Jasmine JSTest.NET QUnit Sinon.js Tyrtle
  • 147. instrumente: documentarea codului Dr. Sabin Buragawww.purl.org/net/busaco Standarde de redactare a codului JavaScript exemple: Crock’s Code Conventions for JavaScript Google JavaScript Style Guide Idiomatic.js ghiduri specifice – e.g., jQuery Core Style Guide
  • 148. instrumente: documentarea codului Dr. Sabin Buragawww.purl.org/net/busaco Software pentru documentarea programelor JSDoc Toolkit jGrouseDoc YUIDoc
  • 149. instrumente: compresie de cod Dr. Sabin Buragawww.purl.org/net/busaco Instrumente privind compresia/minimizarea Online Javascript Compression Tool YUI Compressor Scriptalizer detalii in articolul A. Powell, Understanding Compression and Minification (mai 2012): www.aaron-powell.com/javascript/understanding-compression-and-minification
  • 150. instrumente: optimizare javascript Dr. Sabin Buragawww.purl.org/net/busaco Transformarea codului JS intr-unul optimizat exemplu de referinta: Closure Compiler https://developers.google.com/closure/
  • 151. instrumente Dr. Sabin Buragawww.purl.org/net/busaco Facilitarea dezvoltarii de aplicatii Web la nivel de client similare celor desktop exemplificari notabile: Cappuccino – http://cappuccino.org/ SproutCore – http://www.sproutcore.com/
  • 152. instrumente Dr. Sabin Buragawww.purl.org/net/busaco Alte limbaje pentru dezvoltarea de aplicatii Web CoffeeScript (Jeremy Ashkenas, 2009) http://coffeescript.org/ TypeScript (Microsoft, 2012) http://www.typescriptlang.org/ limbaje de programare care se compileaza in JavaScript
  • 153. instrumente Dr. Sabin Buragawww.purl.org/net/busaco Portarea altor aplicatii in JavaScript Emscripten – compilator LLVM generand cod JS (e.g., programe C/C++, Lua, Python, Ruby ce se pot compila in JavaScript) http://emscripten.org/
  • 154. instrumente Dr. Sabin Buragawww.purl.org/net/busaco Portarea altor aplicatii in JavaScript JSIL – compilator care transforma aplicatiile .NET in programe JavaScript ruland independent de browser http://jsil.org/