una serie a puntate sul "linguaggio di programmazione più incompreso di sempre"
- Douglas Crockford
Marco Patierno - @marcopatierno
Roberto Sasso - @imrobertosasso
Ti presento Javascript
Question time...
A CTO MOZZILA FAUNDATION
C HA UN FRANCHASING DI CAMICE
D IDEATORE DI JAVASCRIPT
B UN SERIAL KILLER
Un pò di storia
C'era una volta
Netscape Navigator 1.1
MochaScript/LiveScript
JScript
Un pò di storia
ECMA Script
Question time...
A UN FAMOSO REGISTA
C HA IDEATO JSON
D IL CTO DI PAYPAL
B IL MANAGER DI CHUCK NORRIS
Il Grande Equivoco
Nome
LISP TRAVESTITO DA C
ERRORI DI PROGGETTAZIONE
PESSIME IMPLEMENTAZIONI
BRUTTI LIBRI
STANDARD AL DI SOTTO DEGLI STANDARD
DILETTANTI
JavaScript non è il fratellino scemo di Java
In effetti non centra (quasi) nulla con Java
( anzi somiglia più a LISP o Scheme )
Non è un mero linguaggio di Scripting
Ha un suo preciso formalismo, e andrebbe assecondato
Le caratteristiche fondamentali
È un linguaggio interpretato (non compilato)
È un linguaggio “Loosely Typed” ovvero scarsamente tipizzato o tipizzazione dinamica
È un linguaggio a scope lessicale
( scope a livello di definizione non a runtime )
È un linguaggio che supporta OOP, procedurale e funzionale
JavaScript
una visita guidata all’interno del linguaggio di
programmazione più stravagante di sempre
[stra-va-gàn-te]
non com. --> estravagante
A agg. (pl. -ti)
1 Eccentrico, bizzarro: è un tipo s.; abitudini stravaganti
2 non com. Che è al di fuori delle regole, dei limiti abituali
Freedom??
Weak Typing
Il tipo della variabile dipende da come viene utilizzata
var foo = 'a-string:';
var number = 1;
var result = foo + number;
console.log(result);
Dynamic Typing 1/2
se cammina come un'anatra e starnazza come un'anatra, allora è un'anatra
var foo = 'a-string';
console.log(typeof(foo));
var foo = 1;
console.log(typeof(foo));
var foo = false;
console.log(typeof(foo));
Dynamic Typing 2/2
se cammina come un'anatra e starnazza come un'anatra, allora è un'anatra
var boolean = false;
obj = {}; //nuovo oggetto
obj.myMethod = function(param) {
if(param) {
obj = 3;
}
return obj;
};
console.log(obj.myMethod(false));
console.log('------------')
console.log(obj.myMethod(true));
console.log('------------')
console.log(obj.myMethod(false));
Paradigma procedurale
Una sequenza ordinata di istruzioni (organizzate per subroutine/funzioni)
atte a risolvere un problema
var nome = "foo",
cognome = "bar",
student = [nome, cognome],
classroom = [];
classroom.push(student);
var studentUnderPopper = classroom.pop();
var x;
for(x in studentUnderPopper) {
console.log(studentUnderPopper[x]);
}
O.O.P.
permette di definire oggetti software in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi.
var student = {};
student.setName = function() {};
student.setSurname = function() {};
var classroom = {};
classroom.addStudent = function(student) {};
classroom.addStudent(student);
OOP Syntaxes – Object Literal Notation 1/3
var student = {
name: “gianni“,
accessories: [“watch“,“pencilcase“],
dress: {
pants: “jeans“,
topWear: “t-shirt“
}
};
var student = {
talk: function() {
//do something
},
walk: function() {
//do something other
},
name: “gianni“,
accessories: [“watch“,“pencilcase“],
dress: {
pants: “jeans“,
topWear: “t-shirt“
}
};
benefits: singleton nativo
svantaggi: non si può inizializzare una proprietà con il valore di un’altra proprietà; il costruttore non è accessibile;
OOP Syntaxes – Object Literal Notation 2/3
var student = {};
student.talk = function() {
return "i'm talking"
};
student.walk = function() {
return "i'm walking"
};
student.name = “gianni“;
student.accessories = [“watch“,“pencilcase“];
student.dress = {};
student.dress.pants = “jeans“;
student.dress.topWear = “t-shirt“;
OOP Syntaxes – Object Literal Notation 3/3a
var student = {
talk: function() {
return "i'm talking";
},
walk: function() {
return "i'm walking";
},
name: "gianni",
accessories: ["watch","pencilcase"],
dress: {
pants: "jeans",
topWear: "t-shirt"
}
};
OLN syntax
OOP Syntaxes – Object Literal Notation 3/3b
var student = {};
student.talk = function() {
return "I'm talking";
};
student.walk = function() {
return "I'm walking";
};
student.name = "gianni";
student.accessories = ["watch","pencilcase"];
student.dress = {};
student.dress.pants = "jeans";
student.dress.topWear = "t-shirt";
OLN syntax, duck-typed
OOP Syntaxes – Function Constructor
benefits: si possono creare più istanze
//constructor
function Student() {
};
var studentInstance = new Student();
In Javascript tutto è un oggetto, persino una function.
OOP – Function Constructor 1/2
//constructor
function Student() {
//private
var watch = “watch“;
var pencilcase = “pencilcase“;
//public
this.accessories = [watch,pencilcase];
};
Una variabile è locale solo quando è specificata come var .
Quel che è this è di dominio pubblico.
OOP Syntaxes – Function Constructor 2/2
//constructor
function Student() {
//private
var watch = 'watch';
var pencilcase = 'pencilcase';
function nonVisible() {
return this.watch;
}
//public
this.accessories = [watch,pencilcase];
this.visibleFunction = nonVisible;
}
var studentInstance = new Student();
console.log(studentInstance.visibleFunction());
//constructor
function Student() {
//private
var watch = 'watch';
var pencilcase = 'pencilcase';
function nonVisible() {
return watch;
}
//public
this.accessories = [watch,pencilcase];
this.visibleFunction = nonVisible;
}
var studentInstance = new Student();
console.log(studentInstance.visibleFunction());
OOP – Anonymous Function Constructor
benefits: si possono creare più istanze
//constructor
var Student = function () {
};
var studentInstance = new Student();
OOP Syntaxes – Anonymous Function Constructor
benefit: si possono creare più istanze
//constructor
var Student = function () {
this.x = 5;
};
Student.talk = function() {
return this.x;
};
var studentInstance = new Student();
benefit: è necessario l’accesso al prototype
//constructor
var Student = function () {
this.x = 5;
};
Student.prototype.talk = function() {
return this.x;
};
var studentInstance = new Student();
OOP – Protochi ? Prototype 1/2
L’ereditarietà in JS non ha nulla a che fare con il «solito»:
Non esiste il concetto di ereditarietà classica.
Non esistono classi. Esistono solo oggetti.
Si basa sul clonaggio degli oggetti
L’oggetto di base clonato è sempre l’Object
Object contiene le proprietà di base constructor, prototype,
valueOf() e toString()
OOP – Protochi ? Prototype 2/2
var Student = function () {};
var studentInstance = new Student();
Quindi, cosa accade quando creo un nuovo oggetto?
1. Crea un nuovo oggetto
2. Setta la proprietà constructor con il contenuto della funzione Student
3. Associa Object.Prototype a Student.Prototype
4. Esegue la funzione anonima in Student
Questo & Quello
“In Javascript la keyword this è estremamente potente(*)”
(*)utilizzabile solo sotto prescrizione medica
- cit. anonimo
Definizione
In ogni contesto d’esecuzione l’utilizzo della keyword this fa riferimento
all’oggetto chiamante ed ha un cliclo di vita pari a quest’ultimo.
Questo & Quello
var student = {};
student.name = 'bob';
student.talk = function() {
return this.name;
};
console.log(student.talk());
Questo & Quello
var studentFirst = {
name: 'marco'
};
studentFirst.sayMyName = function() {
return this.name;
};
console.log(studentFirst.sayMyName());
var studentSecond = {
name: 'bob'
};
studentSecond.talk = studentFirst.talk;
console.log(studentFirst.sayMyName());
Questo & Quello
var studentFirst = {
name: 'marco',
hello: 'hello'
};
studentFirst.sayMyName = function() {
return this.name;
};
studentFirst.sayHello = function() {
var f = function() {
return this.hello;
}
return f();
};
console.log(studentFirst.sayMyName());
console.log(studentFirst.sayHello());
Questo & Quello
var studentFirst = {
name: 'marco',
hello: 'hello'
};
studentFirst.sayMyName = function() {
return this.name;
};
studentFirst.sayHello = function() {
var that = this;
var f = function() {
return that.hello;
}
return f();
};
console.log(studentFirst.sayMyName());
console.log(studentFirst.sayHello());
Questo & Quello...
...e quell'altro, ve lo diciamo la prossima volta
Grazie
@marcopatierno
@imrobertosasso
https://github.com/patiernom
https://github.com/bobbino
Marco Patierno
Roberto Sasso