Classe sintassi di base


Nella programmazione orientata agli oggetti, una classe è un modello di codice-programma estensibile per la creazione di oggetti, fornendo valori iniziali per lo stato (variabili membro) e implementazioni di comportamento (funzioni o metodi membri).

In pratica, abbiamo spesso bisogno di creare molti oggetti dello stesso tipo, come utenti, o merci o qualsiasi altra cosa.

Come già sappiamo dal Costruttore del capitolo, l’operatore “new”, new function può aiutare con questo.,

Ma nel JavaScript moderno, c’è un costrutto “di classe” più avanzato, che introduce nuove grandi funzionalità utili per la programmazione orientata agli oggetti.

La sintassi della “classe”

La sintassi di base è:

class MyClass { // class methods constructor() { ... } method1() { ... } method2() { ... } method3() { ... } ...}

Quindi utilizzare new MyClass() per creare un nuovo oggetto con tutti i metodi elencati.

Il metodoconstructor() viene chiamato automaticamente danew, quindi possiamo inizializzare l’oggetto lì.,

Per esempio:

class User { constructor(name) { this.name = name; } sayHi() { alert(this.name); }}// Usage:let user = new User("John");user.sayHi();

Quando new User("John") si chiama:

  1. viene creato Un nuovo oggetto.
  2. Ilconstructorviene eseguito con l’argomento specificato e lo assegna athis.name.

Then quindi possiamo chiamare metodi oggetto, come user.sayHi().

Nessuna virgola tra i metodi di classe

Una trappola comune per gli sviluppatori alle prime armi è quella di mettere una virgola tra i metodi di classe, che si tradurrebbe in un errore di sintassi.,

La notazione qui non deve essere confusa con i letterali degli oggetti. All’interno della classe, non sono richieste virgole.

Che cos’è una classe?

Quindi, cos’è esattamente unclass? Non è un’entità completamente nuova a livello di linguaggio, come si potrebbe pensare.

Sveliamo ogni magia e vediamo cos’è veramente una classe. Questo aiuterà a comprendere molti aspetti complessi.

In JavaScript, una classe è un tipo di funzione.,

Qui, date un’occhiata:

class User { constructor(name) { this.name = name; } sayHi() { alert(this.name); }}// proof: User is a functionalert(typeof User); // function

che Cosa class User {...} costruire realmente è:

  1. Crea una funzione denominata User, che diventa il risultato della dichiarazione di classe. Il codice della funzione è preso dal metodoconstructor (assunto vuoto se non scriviamo tale metodo).
  2. Memorizza i metodi di classe, come sayHi, in User.prototype.,

Doponew User viene creato l’oggetto, quando chiamiamo il suo metodo, è preso dal prototipo, proprio come descritto nel capitolo F. prototype. Quindi l’oggetto ha accesso ai metodi di classe.,di class User dichiarazione:

Ecco il codice per l’introspezione è:

Non solo zucchero sintattico

a Volte la gente dice che class è un “zucchero sintattico” (sintassi che è stato progettato per rendere le cose più facili da leggere, ma non introduce nulla di nuovo), perché in realtà abbiamo potuto dichiarare lo stesso senza class parola chiave a tutti:

Il risultato di questa definizione è circa la stessa., Quindi, ci sono davvero ragioni per cui class può essere considerato uno zucchero sintattico per definire un costruttore insieme ai suoi metodi prototipo.

Tuttavia, ci sono importanti differenze.

  1. Innanzitutto, una funzione creata daclass è etichettata da una speciale proprietà interna]:"classConstructor". Quindi non è del tutto uguale a crearlo manualmente.

    La lingua controlla quella proprietà in una varietà di luoghi., Per esempio, a differenza di una normale funzione, deve essere chiamato con new:

    class User { constructor() {}}alert(typeof User); // functionUser(); // Error: Class constructor User cannot be invoked without 'new'

    Inoltre, una rappresentazione di stringa di un costruttore di classe in più motori JavaScript inizia con la “classe…”

    class User { constructor() {}}alert(User); // class User { ... }

    Ci sono altre differenze, li vedremo presto.

  2. I metodi di classe non sono enumerabili.,Una definizione di classe impostaenumerable flag afalse per tutti i metodi nel"prototype".

    Va bene, perché se for..in su un oggetto, di solito non vogliamo i suoi metodi di classe.

  3. Classi sempreuse strict.Tutto il codice all’interno del costrutto di classe è automaticamente in modalità rigorosa.

Inoltre, class sintassi porta molte altre caratteristiche che esploreremo in seguito.,

Espressione di classe

Proprio come le funzioni, le classi possono essere definite all’interno di un’altra espressione, passate, restituite, assegnate, ecc.

Ecco un esempio di espressione di classe:

let User = class { sayHi() { alert("Hello"); }};

Simile alle espressioni di funzione con nome, le espressioni di classe possono avere un nome.,

Se un’espressione di classe ha un nome, è visibile solo all’interno della classe:

Possiamo persino creare classi dinamicamente “on-demand”, come questa:

Getter/setter

Proprio come gli oggetti letterali, le classi possono includere getter/setter, proprietà calcolate ecc.

Ecco un esempio peruser.name implementato usandoget/set:

Tecnicamente, tale dichiarazione di classe funziona creando getter e setter inUser.prototype.,

Calcolata nomi

Ecco un esempio con una calcolata con il nome del metodo che utilizza le parentesi :

class User { () { alert("Hello"); }}new User().sayHi();

Tali caratteristiche sono facili da ricordare, come si assomigliano che di letterale oggetti.

Campi di classe

I vecchi browser potrebbero aver bisogno di un polyfill

I campi di classe sono una recente aggiunta alla lingua.

In precedenza, le nostre classi avevano solo metodi.

“Campi di classe” è una sintassi che permette di aggiungere qualsiasi proprietà.,

Per esempio, aggiungiamo name proprietà class User:

class User { name = "John"; sayHi() { alert(`Hello, ${this.name}!`); }}new User().sayHi(); // Hello, John!

Così, ci basta che scrivi ” = ” nella dichiarazione, e basta.,

L’importante differenza di classe dei campi, che sono impostati su singoli oggetti, non User.prototype:

class User { name = "John";}let user = new User();alert(user.name); // Johnalert(User.prototype.name); // undefined

Possiamo anche assegnare dei valori utilizzando le espressioni più complesse e chiamate di funzione:

class User { name = prompt("Name, please?", "John");}let user = new User();alert(user.name); // John

Rendere i metodi associati con i campi della classe

Come dimostrato nel capitolo associazione di Funzione funzioni in JavaScript dispone di una dinamica this., Dipende dal contesto della chiamata.

Quindi se un metodo object viene passato e chiamato in un altro contesto,this non sarà più un riferimento al suo oggetto.

Ad esempio, questo codice mostrerà undefined:

Il problema è chiamato “perdere this“.

Ci sono due approcci per risolverlo, come discusso nel capitolo Function binding:

  1. Passa una funzione wrapper, comesetTimeout(() => button.click(), 1000).
  2. Associa il metodo all’oggetto, ad esempio nel costruttore.,

I campi di classe forniscono un’altra sintassi abbastanza elegante:

Il campo di classeclick = () => {...} viene creato su base per oggetto, c’è una funzione separata per ogniButton oggetto, conthis al suo interno che fa riferimento a quell’oggetto. Possiamo passarebutton.click ovunque e il valore dithis sarà sempre corretto.

È particolarmente utile nell’ambiente browser, per gli ascoltatori di eventi.,

Sommario

La sintassi di base della classe si presenta così:

MyClass è tecnicamente una funzione (quella che forniamo comeconstructor), mentre metodi, getter e setter sono scritti inMyClass.prototype.

Nei prossimi capitoli impareremo di più sulle classi, tra cui l’ereditarietà e altre caratteristiche.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *