La sintassi della classe ES6 non modifica affatto la funzionalità di Javascript. È semplicemente lo zucchero di sintassi per le dichiarazioni di prototipi. Una volta analizzato, crea solo oggetti prototipo che possono quindi essere utilizzati in modo OO allo stesso modo in cui gli oggetti prototipo dichiarati manualmente sono sempre stati utilizzati in JS. Quindi, la sintassi della classe non cambia davvero nulla, tranne rendere più carine le definizioni dei prototipi da dichiarare. Gli oggetti risultanti non sono più simili a una classe di quelli che le persone hanno fatto manualmente in ES5.
Ecco un esempio (esegui solo in un browser che supporta la sintassi ES6% diclass
come Chrome a partire da dicembre 2015).
// ES6 class syntax
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
calcArea() {
return this.height * this.width;
}
get area() {
return this.calcArea()
}
}
// ES5 equivalent prototype syntax
function Poly(height, width) {
this.height = height;
this.width = width;
}
Object.defineProperties(Poly.prototype, {
calcArea: {
value: function () {
return this.height * this.width;
}
},
area: {
get: function () {
return this.calcArea();
}
}
});
var p1 = new Polygon(10, 20);
var p2 = new Poly(10, 20);
log(p1.area);
log(p2.area);
log(Object.getOwnPropertyNames(Object.getPrototypeOf(p1)));
log(Object.getOwnPropertyNames(Object.getPrototypeOf(p2)));
Output in Chrome a partire da dicembre 2015:
200
200
["constructor","calcArea","area"]
["constructor","calcArea","area"]
Working jsFiddle: link