Clasa de bază sintaxa

Î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:

  1. Un obiect nou este creat.
  2. constructor ruleaza cu argumentul dat și atribuie-l la this.name.

…atunci putem apela metode Obiect, cum ar fiuser.sayHi().

fără virgulă între metodele clasei

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:

  1. Creează o funcție numită User, care devine rezultatul declarație de clasă. Codul funcției este preluat din metoda constructor(presupus gol dacă nu scriem o astfel de metodă).
  2. Magazine clasa de metode, cum ar fi sayHi, în User.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 classeste 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ă

    browserele vechi pot avea nevoie de un polyfill

    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:

    1. Trece un wrapper-funcție, cum ar fi setTimeout(() => button.click(), 1000).
    2. 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.clickoriunde, 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.

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *