Aperçu
En ES6, la classe (class) est introduite comme modèle pour les objets, et les classes peuvent être définies à l'aide du mot-clé class.
L'essence d'une classe est une fonction.
Elle peut être considérée comme du sucre syntaxique, rendant la syntaxe du prototype d'objet plus claire et plus proche de la syntaxe de la programmation orientée objet.
Utilisation de base
Définition de classe
Les expressions de classe peuvent être anonymes ou nommées.
let Exemple = class {
constructor(a) {
this.a = a;
}
}
let Example = class Exemple {
constructor(a) {
this.a = a;
}
}
Déclaration de classe
class Exemple {
constructor(a) {
this.a = a;
}
}
Remarque importante : ne peut pas être redéclaré.
class Example{}
class Example{}
let Example1 = class{}
class Example{}
Remarques importantes
Les définitions de classe ne sont pas hissées, ce qui signifie que vous devez définir une classe avant d'y accéder, sinon une erreur sera levée.
Les méthodes dans une classe ne nécessitent pas le mot-clé function.
Les points-virgules ne peuvent pas être ajoutés entre les méthodes.
new Example();
class Example {}
Corps de classe
Propriétés
prototype
En ES6, le prototype existe toujours. Bien que les méthodes puissent être définies directement dans la classe, elles sont en fait toujours définies sur le prototype.
Redéfinir les méthodes / Ajouter des méthodes lors de l'initialisation
Ajouter des méthodes
Object.assign(Example.prototype,{
})
Propriétés statiques
Propriétés statiques : propriétés de la classe elle-même, c'est-à-dire propriétés définies directement à l'intérieur de la classe (Class.propname), qui ne nécessitent pas d'instanciation.
En ES6, il est précisé que la classe ne possède que des méthodes statiques, pas de propriétés statiques.
class Example {
static a = 2;
}
Exemple.b = 2;
Propriétés publiques
class Example{}
Example.prototype.a = 2;
Propriétés d'instance
Propriétés d'instance : propriétés définies sur l'objet d'instance (this).
class Example {
a = 2;
constructor () {
console.log(this.a);
}
}
propriété name
Renvoie le nom de la classe suivant class (si présent).
let Example=class Exam {
constructor(a) {
this.a = a;
}
}
console.log(Example.name);
let Example=class {
constructor(a) {
this.a = a;
}
}
console.log(Example.name);
Méthodes
méthode constructor
La méthode constructor est la méthode par défaut d'une classe et est appelée lors de la création d'un objet instance de la classe.
class Example{
constructor(){
console.log('Je suis constructor');
}
}
new Example();
Retourner un objet
class Test {
constructor(){
}
}
console.log(new Test() instanceof Test);
class Example {
constructor(){
return new Test();
}
}
console.log(new Example() instanceof Example);
Méthodes statiques
class Example{
static sum(a, b) {
console.log(a+b);
}
}
Example.sum(1, 2);
Méthodes de prototype
class Example {
sum(a, b) {
console.log(a + b);
}
}
let exam = new Example();
exam.sum(1, 2);
Méthodes d'instance
class Exemple {
constructor() {
this.sum = (a, b) => {
console.log(a + b);
}
}
}
Instanciation de classe
nouveau
L'instanciation d'une classe doit utiliser le mot-clé new.
class Example {}
let exam1 = Example();
Objet instancié
Objet prototype partagé
class Exemple {
constructor(a, b) {
this.a = a;
this.b = b;
console.log('Example');
}
sum() {
return this.a + this.b;
}
}
let exam1 = new Example(2, 1);
let exam2 = new Example(3, 1);
console.log(Object.getPrototypeOf(exam1) === Object.getPrototypeOf(exam2));
Object.getPrototypeOf(exam1).sub = function() {
return this.a - this.b;
}
console.log(exam1.sub());
console.log(exam2.sub());
décorateur
Un décorateur est une fonction utilisée pour modifier le comportement d'une classe, prenant effet au moment de la compilation du code.
Décorateur de classe
Un paramètre
Le premier paramètre, target, pointe vers la classe elle-même.
function testable(target) {
target.isTestable = true;
}
@testable
class Example {}
Example.isTestable;
Plusieurs paramètres — implémentation imbriquée
function testable(isTestable) {
return function(target) {
target.isTestable=isTestable;
}
}
@testable(true)
class Example {}
Example.isTestable;
Propriétés d'instance
Les deux exemples ci-dessus ajoutent des propriétés statiques. Pour ajouter des propriétés d'instance, il suffit d'opérer sur le prototype de la classe.
Décorateur de méthode
Trois paramètres : target (l'objet prototype de la classe), name (le nom de la propriété modifiée), descriptor (l'objet descripteur de la propriété).
class Example {
@writable
sum(a, b) {
return a + b;
}
}
function writable(target, name, descriptor) {
descriptor.writable = false;
return descriptor;
}
Ordre d'exécution des décorateurs
Entre de l'extérieur vers l'intérieur, s'exécute de l'intérieur vers l'extérieur.
class Example {
@logMethod(1)
@logMethod(2)
sum(a, b){
return a + b;
}
}
function logMethod(id) {
console.log('logMethod évalué'+id);
return (target, name, desctiptor) => console.log('logMethod exécuté '+id);
}
Encapsulation et héritage
getter / setter
Définition
class Exemple{
constructor(a, b) {
this.a = a;
this.b = b;
}
get a(){
console.log('getter');
return this.a;
}
set a(a){
console.log('setter');
this.a = a;
}
}
let exam = new Example(1,2);
class Example1{
constructor(a, b) {
this.a = a;
this.b = b;
}
get a(){
console.log('getter');
return this._a;
}
set a(a){
console.log('setter');
this._a = a;
}
}
let exam1 = new Example1(1,2);
console.log(exam1._a);
getter ne peut pas apparaître seul
class Exemple {
constructor(a) {
this.a = a;
}
get a() {
return this.a;
}
}
let exam = new Example(1);
getter et setter doivent apparaître au même niveau
class Father {
constructor(){}
get a() {
return this._a;
}
}
class Child extends Father {
constructor(){
super();
}
set a(a) {
this._a = a;
}
}
let test = new Child();
test.a = 2;
console.log(test.a);
class Father1 {
constructor(){}
get a() {
return this._a;
}
set a(a) {
this._a = a;
}
}
class Child1 extends Father1 {
constructor(){
super();
}
}
let test1 = new Child1();
test1.a = 2;
console.log(test1.a);
extends
L'héritage des classes est implémenté via extends.
class Child extends Father { ... }
super
La méthode constructeur de la sous-classe doit contenir super, et elle doit apparaître avant this.
class Father {
constructor() {}
}
class Child extends Father {
constructor() {}
}
let test = new Child();
L'appel du constructeur de la classe parente ne peut apparaître que dans le constructeur de la sous-classe.
class Father {
test(){
return 0;
}
static test1(){
return 1;
}
}
class Child extends Father {
constructor(){
super();
}
}
class Child1 extends Father {
test2() {
super();
}
}
Appel des méthodes de la classe parente : super, en tant qu'objet, pointe vers l'objet prototype de la classe parente dans les méthodes normales, et vers la classe parente dans les méthodes statiques.
class Child2 extends Father {
constructor(){
super();
console.log(super.test());
}
static test3(){
return super.test1+2;
}
}
Child2.test3();
Remarques importantes
Impossible d'hériter d'objets réguliers.
var Father = {
}
class Child extends Father {
}
Object.setPrototypeOf(Child.prototype, Father);