Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Arbejde med Private Egenskaber i Klasser | Mestering af JavaScript-klasser og Arv
Avanceret JavaScript-Mestring

bookArbejde med Private Egenskaber i Klasser

I klassebaseret programmering opstår der ofte situationer, hvor det er nødvendigt at begrænse direkte adgang til visse egenskaber for at beskytte dataintegritet og kontrollere, hvordan de ændres.

Hvad er private egenskaber?

I JavaScript er klasseegenskaber typisk offentlige, hvilket betyder, at de kan tilgås og ændres udefra klassen. Der kan dog være behov for at begrænse adgangen til bestemte egenskaber, så de kun kan tilgås eller ændres inden for selve klassen. Disse kaldes private egenskaber.

Private egenskaber hjælper med at skabe en tydelig grænse mellem klassens interne funktionalitet og ekstern kode. De er nyttige, når man ønsker at skjule følsomme data eller forhindre utilsigtede ændringer af en egenskab udefra klassen.

Tænk på det som motoren i en bil. Du kan køre bilen og bruge dens betjeningspaneler, men du har ikke direkte adgang til motorkomponenterne under kørslen. Motoren er beskyttet mod udefrakommende indgreb, og kun autoriserede mekanikere (klassemetoder) kan foretage justeringer.

Sådan deklareres og anvendes private felter i en klasse

I JavaScript deklareres private egenskaber ved hjælp af #-syntaksen (introduceret i ES2020). Ved at sætte # foran et egenskabsnavn gøres det privat, hvilket betyder, at det kun kan tilgås inden for selve klassen.

12345678910111213141516171819202122
class Animal { #type; // Declaring a private field constructor(name, type) { this.name = name; this.#type = type; // Assigning a value to the private field } getInfo() { return `${this.name} is a ${this.#type} animal.`; } changeType(newType) { this.#type = newType; // Modifying the private field within the class } } const lion = new Animal('Lion', 'Wild'); console.log(lion.getInfo()); // Output: Lion is a Wild animal // Attempt to access private field directly (this will cause an error) console.log(lion.#type); // Uncaught SyntaxError: Private field '#type' must be declared in an enclosing class
copy

I dette eksempel er #type et privat felt. Det kan ikke tilgås eller ændres uden for Animal-klassen. Ethvert forsøg på at tilgå #type direkte fra en instans (som lion.#type) vil resultere i en syntaksfejl. Dette sikrer, at følsomme eller kritiske data kun ændres gennem kontrollerede metoder defineret i klassen.

Fordele ved private egenskaber

  1. Private egenskaber beskytter følsomme data ved at forhindre ekstern adgang. De sikrer, at data kun kan ændres gennem specifikke metoder, hvilket reducerer risikoen for utilsigtede eller uautoriserede ændringer;
  2. Private egenskaber gør det muligt at kapsle implementeringsdetaljer ind og skjule intern logik for brugeren. Dette fremmer en klar adskillelse af ansvar og holder koden modulær;
  3. Med private egenskaber opnås mere præcis kontrol over, hvordan data tilgås og ændres inden for en klasse, hvilket sikrer, at ændringer sker gennem veldefinerede metoder.

Virkeligt eksempel: Bankkonto

Lad os tage en virkelig analogi med håndtering af en bankkontosaldo. I en bank er saldoen på din konto beskyttet, og ingen kan få adgang til eller ændre den direkte. Du kan kun interagere med den gennem autoriserede processer som indbetalinger og hævninger. På samme måde kan vi bruge private egenskaber i en klasse til at beskytte saldo-feltet mod at blive tilgået eller ændret direkte.

12345678910111213141516171819202122232425262728293031323334353637
class BankAccount { #balance; // Private field constructor(owner, initialBalance) { this.owner = owner; this.#balance = initialBalance; } // Method to deposit money deposit(amount) { if (amount > 0) { this.#balance += amount; } } // Method to withdraw money withdraw(amount) { if (amount > 0 && amount <= this.#balance) { this.#balance -= amount; } } // Method to get account balance getBalance() { return `Account balance for ${this.owner}: $${this.#balance}`; } } const account = new BankAccount('John', 1000); account.deposit(500); console.log(account.getBalance()); // Output: Account balance for John: $1500 account.withdraw(200); console.log(account.getBalance()); // Output: Account balance for John: $1300 // Direct access to balance is not allowed console.log(account.#balance); // SyntaxError: Private field '#balance' must be declared in an enclosing class
copy

I dette eksempel er feltet #balance privat og kan kun tilgås gennem offentlige metoder som deposit, withdraw og getBalance. Dette sikrer, at saldoen ændres på en kontrolleret måde og beskytter den mod uautoriseret adgang eller manipulation.

1. Hvad er hovedårsagen til at bruge private egenskaber i en klasse?

2. Hvordan erklærer man en privat egenskab?

3. Hvad sker der, hvis du forsøger at tilgå en privat egenskab uden for en klasse?

question mark

Hvad er hovedårsagen til at bruge private egenskaber i en klasse?

Select the correct answer

question mark

Hvordan erklærer man en privat egenskab?

Select the correct answer

question mark

Hvad sker der, hvis du forsøger at tilgå en privat egenskab uden for en klasse?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 7

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Suggested prompts:

Can you explain how private properties differ from protected or public properties in JavaScript?

Are there any limitations or caveats when using private fields in JavaScript classes?

Can you show more examples of when to use private properties in real-world scenarios?

Awesome!

Completion rate improved to 2.22

bookArbejde med Private Egenskaber i Klasser

Stryg for at vise menuen

I klassebaseret programmering opstår der ofte situationer, hvor det er nødvendigt at begrænse direkte adgang til visse egenskaber for at beskytte dataintegritet og kontrollere, hvordan de ændres.

Hvad er private egenskaber?

I JavaScript er klasseegenskaber typisk offentlige, hvilket betyder, at de kan tilgås og ændres udefra klassen. Der kan dog være behov for at begrænse adgangen til bestemte egenskaber, så de kun kan tilgås eller ændres inden for selve klassen. Disse kaldes private egenskaber.

Private egenskaber hjælper med at skabe en tydelig grænse mellem klassens interne funktionalitet og ekstern kode. De er nyttige, når man ønsker at skjule følsomme data eller forhindre utilsigtede ændringer af en egenskab udefra klassen.

Tænk på det som motoren i en bil. Du kan køre bilen og bruge dens betjeningspaneler, men du har ikke direkte adgang til motorkomponenterne under kørslen. Motoren er beskyttet mod udefrakommende indgreb, og kun autoriserede mekanikere (klassemetoder) kan foretage justeringer.

Sådan deklareres og anvendes private felter i en klasse

I JavaScript deklareres private egenskaber ved hjælp af #-syntaksen (introduceret i ES2020). Ved at sætte # foran et egenskabsnavn gøres det privat, hvilket betyder, at det kun kan tilgås inden for selve klassen.

12345678910111213141516171819202122
class Animal { #type; // Declaring a private field constructor(name, type) { this.name = name; this.#type = type; // Assigning a value to the private field } getInfo() { return `${this.name} is a ${this.#type} animal.`; } changeType(newType) { this.#type = newType; // Modifying the private field within the class } } const lion = new Animal('Lion', 'Wild'); console.log(lion.getInfo()); // Output: Lion is a Wild animal // Attempt to access private field directly (this will cause an error) console.log(lion.#type); // Uncaught SyntaxError: Private field '#type' must be declared in an enclosing class
copy

I dette eksempel er #type et privat felt. Det kan ikke tilgås eller ændres uden for Animal-klassen. Ethvert forsøg på at tilgå #type direkte fra en instans (som lion.#type) vil resultere i en syntaksfejl. Dette sikrer, at følsomme eller kritiske data kun ændres gennem kontrollerede metoder defineret i klassen.

Fordele ved private egenskaber

  1. Private egenskaber beskytter følsomme data ved at forhindre ekstern adgang. De sikrer, at data kun kan ændres gennem specifikke metoder, hvilket reducerer risikoen for utilsigtede eller uautoriserede ændringer;
  2. Private egenskaber gør det muligt at kapsle implementeringsdetaljer ind og skjule intern logik for brugeren. Dette fremmer en klar adskillelse af ansvar og holder koden modulær;
  3. Med private egenskaber opnås mere præcis kontrol over, hvordan data tilgås og ændres inden for en klasse, hvilket sikrer, at ændringer sker gennem veldefinerede metoder.

Virkeligt eksempel: Bankkonto

Lad os tage en virkelig analogi med håndtering af en bankkontosaldo. I en bank er saldoen på din konto beskyttet, og ingen kan få adgang til eller ændre den direkte. Du kan kun interagere med den gennem autoriserede processer som indbetalinger og hævninger. På samme måde kan vi bruge private egenskaber i en klasse til at beskytte saldo-feltet mod at blive tilgået eller ændret direkte.

12345678910111213141516171819202122232425262728293031323334353637
class BankAccount { #balance; // Private field constructor(owner, initialBalance) { this.owner = owner; this.#balance = initialBalance; } // Method to deposit money deposit(amount) { if (amount > 0) { this.#balance += amount; } } // Method to withdraw money withdraw(amount) { if (amount > 0 && amount <= this.#balance) { this.#balance -= amount; } } // Method to get account balance getBalance() { return `Account balance for ${this.owner}: $${this.#balance}`; } } const account = new BankAccount('John', 1000); account.deposit(500); console.log(account.getBalance()); // Output: Account balance for John: $1500 account.withdraw(200); console.log(account.getBalance()); // Output: Account balance for John: $1300 // Direct access to balance is not allowed console.log(account.#balance); // SyntaxError: Private field '#balance' must be declared in an enclosing class
copy

I dette eksempel er feltet #balance privat og kan kun tilgås gennem offentlige metoder som deposit, withdraw og getBalance. Dette sikrer, at saldoen ændres på en kontrolleret måde og beskytter den mod uautoriseret adgang eller manipulation.

1. Hvad er hovedårsagen til at bruge private egenskaber i en klasse?

2. Hvordan erklærer man en privat egenskab?

3. Hvad sker der, hvis du forsøger at tilgå en privat egenskab uden for en klasse?

question mark

Hvad er hovedårsagen til at bruge private egenskaber i en klasse?

Select the correct answer

question mark

Hvordan erklærer man en privat egenskab?

Select the correct answer

question mark

Hvad sker der, hvis du forsøger at tilgå en privat egenskab uden for en klasse?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 7
some-alt