În programarea orientata-obiect, o clasa este un extensibil program-cod-șablon pentru crearea de obiecte, furnizarea de valorile inițiale pentru stat (variabilele membre) și implementări de comportament (funcții membre sau metode).
în practică, de multe ori trebuie să creăm multe obiecte de același fel, cum ar fi Utilizatorii sau bunurile sau orice altceva.
după cum știm deja din capitolul Constructor, operatorul „nou”, new function
poate ajuta cu asta.,
dar în JavaScript-ul modern, există o construcție „de clasă” mai avansată, care introduce noi caracteristici noi care sunt utile pentru programarea orientată pe obiecte.
„clasa” sintaxa
De bază sintaxa este:
class MyClass { // class methods constructor() { ... } method1() { ... } method2() { ... } method3() { ... } ...}
utilizare new MyClass()
pentru a crea un obiect nou, cu toate metodele enumerate.
metoda constructor()
este apelată automat de new
, astfel încât să putem inițializa obiectul acolo.,
De exemplu:
class User { constructor(name) { this.name = name; } sayHi() { alert(this.name); }}// Usage:let user = new User("John");user.sayHi();
new User("John")
se numește:
- Un obiect nou este creat.
-
constructor
ruleaza cu argumentul dat și atribuie-l lathis.name
.
…atunci putem apela metode Obiect, cum ar fiuser.sayHi()
.
o capcană comună pentru dezvoltatorii începători este de a pune o virgulă între metodele clasei, ceea ce ar duce la o eroare de sintaxă.,notația de aici nu trebuie confundată cu literalii obiectelor. În cadrul clasei, nu sunt necesare virgule.
ce este o clasă?
Deci, ce este exact un class
? Aceasta nu este o entitate cu totul nouă la nivel de limbă, așa cum s-ar putea crede.
să dezvăluim orice magie și să vedem ce este cu adevărat o clasă. Asta va ajuta la înțelegerea multor aspecte complexe.
în JavaScript, o clasă este un fel de funcție.,
Aici, să ia o privire:
class User { constructor(name) { this.name = name; } sayHi() { alert(this.name); }}// proof: User is a functionalert(typeof User); // function
Ce class User {...}
construi într-adevăr nu este:
- Creează o funcție numită
User
, care devine rezultatul declarație de clasă. Codul funcției este preluat din metodaconstructor
(presupus gol dacă nu scriem o astfel de metodă). - Magazine clasa de metode, cum ar fi
sayHi
, înUser.prototype
.,
new User
obiectul este creat, atunci când vom apela metoda sa, a luat de la prototip, la fel cum este descris în capitolul F. prototip. Deci obiectul are acces la metode de clasă.,de class User
declarație:
Aici este codul pentru a cerceta aceasta:
Nu doar un sintactică de zahăr
Uneori, oamenii spun că class
este un „zahăr sintactic” (sintaxă, care este proiectat pentru a face lucrurile mai ușor de citit, dar nu introduce nimic nou), pentru că am putea de fapt să declare același lucru fără class
cheie la toate:
rezultatul acestei definiții este de aproximativ aceeași., Deci, există într-adevăr motive pentru care class
poate fi considerat un zahăr sintactic pentru a defini un constructor împreună cu metodele sale prototip.totuși, există diferențe importante.mai întâi, o funcție creată de class
este etichetată de o proprietate internă specială ]:"classConstructor"
. Deci nu este în întregime același lucru cu crearea manuală.
limba verifică proprietatea respectivă într-o varietate de locuri., De exemplu, spre deosebire de o funcție regulate, trebuie să fie numit cu new
:
class User { constructor() {}}alert(typeof User); // functionUser(); // Error: Class constructor User cannot be invoked without 'new'
de Asemenea, un șir de reprezentare a unui constructor de clasă în cele mai multe JavaScript motoarele începe cu „clasa…”
class User { constructor() {}}alert(User); // class User { ... }
Există și alte diferențe, le vom vedea în curând.
metodele de clasă nu sunt enumerabile.,Definitia clasei seturi enumerable
steagul false
pentru toate metodele în "prototype"
.
asta e bine, pentru că dacă for..in
peste un obiect, de obicei nu vrem metodele sale de clasă.
clase întotdeauna use strict
.Tot codul din interiorul constructului de clasă este automat în modul strict.
în plus,class
sintaxa aduce multe alte caracteristici pe care le vom explora mai târziu.,la fel ca funcțiile, clasele pot fi definite în interiorul unei alte expresii, transmise, returnate, atribuite etc.
Iată un exemplu de expresie de clasă:
let User = class { sayHi() { alert("Hello"); }};
Similar cu expresii de funcții numite, expresii de clasă pot avea un nume.,
dacă o expresie de clasă are un nume, este vizibilă doar în interiorul clasei:
putem chiar să facem clase în mod dinamic „la cerere”, astfel:
Getters/setters
la fel ca obiectele literale, clasele pot include getters / setters, proprietăți calculate etc.
Aici e un exemplu pentru user.name
implementate folosind get/set
:
din punct de vedere Tehnic, o astfel de declarație de clasă funcționează prin a crea o getters și setteri în User.prototype
.,
Calculat nume
Aici e un exemplu cu un calculat denumirea metodei folosind paranteze :
class User { () { alert("Hello"); }}new User().sayHi();
Aceste caracteristici sunt ușor de ținut minte, ca ei seamănă cu cea a literală obiecte.
câmpuri de clasă
câmpurile de clasă sunt o adăugare recentă a limbii.anterior, clasele noastre aveau doar metode.
„câmpuri de clasă” este o sintaxă care permite adăugarea oricăror proprietăți.,
De exemplu, să adăugați name
proprietatea de a class User
:
class User { name = "John"; sayHi() { alert(`Hello, ${this.name}!`); }}new User().sayHi(); // Hello, John!
Deci, vom scrie doar ” = ” în declarație, și asta este.,
Cel mai important diferenta de clasa domenii este faptul că acestea sunt stabilite pe obiecte individuale, nu User.prototype
:
class User { name = "John";}let user = new User();alert(user.name); // Johnalert(User.prototype.name); // undefined
de asemenea, putem atribui valori folosind expresii mai complexe și apeluri de funcții:
class User { name = prompt("Name, please?", "John");}let user = new User();alert(user.name); // John
Face legat metode cu clasa domenii
Cum s-a demonstrat în capitolul Funcția de legare funcții în JavaScript au o dinamică this
., Depinde de contextul apelului.
deci, dacă o metodă obiect este transmisă și apelată într-un alt context, this
nu va mai fi o referință la obiectul său.
De exemplu, acest cod va arăta undefined
:
problema este numit „pierde this
„.
Există două abordări pentru fixare, cum s-a discutat în capitolul Funcție obligatorii:
- Trece un wrapper-funcție, cum ar fi
setTimeout(() => button.click(), 1000)
. - legați metoda de obiect, de exemplu în constructor.,
Clasa domenii oferi un alt, destul de elegant sintaxa:
clasa click = () => {...}
este creat pe fiecare obiect de bază, există o funcție separată pentru fiecare Button
obiect, cu this
în interiorul acestuia referire la obiect. Putem trece button.click
oriunde, iar valoarea this
va fi întotdeauna corectă.acest lucru este util mai ales în mediul browser-ului, pentru ascultătorii de evenimente.,
Sumar
clasa de bază sintaxa arată astfel:
MyClass
din punct de vedere tehnic este o funcție (cea care ne asigura ca constructor
), în timp ce metodele, getters și setteri sunt scrise pentru MyClass.prototype
.în capitolele următoare vom afla mai multe despre clase, inclusiv moștenire și alte caracteristici.