Campi e metodi dei corsi

Campi

I campi della classe vengono dichiarati direttamente nel corpo di una classe, non aggiunti esplicitamente come proprietà del valore this. Tuttavia, il risultato è lo stesso: una proprietà definita sulle istanze di quella classe.

class MyClass {
    myField;
}

const myClassInstance = new MyClass();

myClassInstance;
> MyClass { myField: undefined }

Puoi inizializzare un campo con un valore. Spesso si tratta di un valore predefinito che la logica all'interno della classe può sovrascrivere:

class MyClass {
    myResult = false;
    set setValue( myValue ) {
        this.myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> Object { myResult: false }

myClassInstance.setValue = true;

myClassInstance;\
> Object { myResult: true }

I campi della classe sono identici dal punto di vista delle proprietà associate alla classe utilizzando this. Ciò significa che è possibile accedervi e modificarli dall'esterno della classe come qualsiasi altra proprietà.

class MyClass {
    myField = true;
}

const myClassInstance = new MyClass();

myClassInstance.myField;
> true

myClassInstance.myField = false;

myClassInstance.myField;
> false;

I campi forniscono una base per alcune delle funzionalità più avanzate dei corsi.

Metodi e campi privati

I campi e i metodi privati sono inaccessibili al di fuori di una classe. Una proprietà privata è associata a un'istanza di una classe, il che significa che ogni istanza contiene il proprio insieme di metodi e campi privati, come definito nella classe.

Per rendere privata una proprietà, aggiungi # all'inizio dell'identificatore quando lo dichiari:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {}
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myPrivateField: true }
    #myPrivateField: true
    <prototype>: Object { … }
        constructor: class MyClass {}
        <prototype>: Object { … }

È necessario dichiarare un campo privato nel corpo della classe contenitore. Puoi modificare il valore in un secondo momento come proprietà di this, ma non puoi creare il campo utilizzando this.

Non è possibile accedere ai campi privati da qualsiasi altra posizione in uno script. Ciò impedisce che le proprietà dei dati vengano modificate al di fuori dei metodi getter e setter forniti per interagire con i valori che contengono e impedisce l'accesso diretto ai metodi destinati a essere utilizzati solo all'interno della classe stessa.

class MyClass {
    #myResult = false;
    set setValue( myValue ) {
        this.#myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myResult: false }

myClassInstance.#myResult = true;
> Uncaught SyntaxError: reference to undeclared private field or method #myResult

myClassInstance.setValue = true;

myClassInstance;\
> MyClass { #myResult: true }

Tuttavia, tieni presente che le console per gli sviluppatori dei browser sono generalmente molto permissive, anche se incoerenti, in merito all'autorizzazione dell'accesso ai campi privati per scopi di debug:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> true

myClassInstance.#myPrivateMethod();
> "This is inside a private method."
class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

myClassInstance.#myPrivateMethod();
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateMethod

L'ambito dei campi privati è ristretto al corpo della classe che li contiene, il che significa che nemmeno le classi secondarie non possono accedere ai campi privati associati a una classe padre:

class MyClass {
    #myPrivateField = true;
}
class ChildClass extends MyClass {
    childMethod() {
        console.log( this.#myPrivateField );
    }
}
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

Metodi e campi statici

I campi e i metodi statici fanno parte di una classe stessa, non dei membri delle istanze di quella classe. Per questo motivo, i campi statici forniscono un punto centrale per i dati non univoci per ogni istanza di una classe, ma che potrebbero dover fare riferimento a queste istanze, ad esempio informazioni di configurazione condivise. I metodi statici sono spesso funzioni di utilità per lavorare con le istanze di una classe, come confrontare o ordinare le istanze in base a un campo che contengono.

Per definire metodi e campi statici nel corpo di una classe, utilizza la parola chiave static:

class MyClass {
    static myStaticField;
    static myStaticMethod() {}
}
const myClassInstance = new MyClass();

Puoi anche utilizzare la notazione dei punti per creare un metodo statico:

class MyClass {
    constructor() {}
}
MyClass.myStaticMethod = function() {}

Non puoi accedere alle proprietà statiche da un'istanza della loro classe, ma sono disponibili nel costruttore della classe:

class MyClass {
    static myStaticField = true;
    static myStaticMethod() {
        console.log( "A static method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance.myStaticField;
> undefined

myClassInstance.myStaticMethod();
> Uncaught TypeError: myClassInstance.myStaticMethod is not a function

MyClass.myStaticField;
> true

MyClass.myStaticMethod();
> "A static method."

Non sono tecnicamente obbligatori, ma l'uso di metodi statici è una best practice per creare utilità che funzionino con le istanze di una classe. Alcuni esempi potrebbero includere un metodo statico dedicato all'ordinamento delle istanze di una classe o un metodo statico di produzione che contiene qualsiasi configurazione necessaria per creare un'istanza di una classe e quindi restituisce l'istanza di classe:

class User {
    constructor( name, email ) {
        this.name = name;
        this.email = email;
    }
    static fromObject( myObject ) {
        return new User( myObject.name, myObject.email ?? "Omitted" );
    }
}
const userObject = {
    "name" : "My Name",
    "email" : "my@email.address"
};
const secondUserObject = {
    "name" : "My Name"
};

const firstUser = User.fromObject( userObject );
const secondUser = User.fromObject( secondUserObject );

firstUser;
> Object { name: "My Name", email: "my@email.address" }

secondUser;
> Object { name: "My Name", email: "Omitted" }

Verifica le tue conoscenze

A quali dei seguenti tipi di campi è possibile accedere solo dall'interno della classe?

Campi privati
Campi del corso
Static fields