Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Challenge: Implementing Private Properties in a Class | Classes
Advanced JavaScript Mastery
course content

Course Content

Advanced JavaScript Mastery

Advanced JavaScript Mastery

1. Classes
2. DOM Manipulation
3. Events and Event Handling
4. Asynchronous JavaScript and APIs

bookChallenge: Implementing Private Properties in a Class

Task

You're creating a BankAccount class to manage users' bank accounts securely. Each account has an owner and a balance, but you want the balance to be protected from direct access. Your goal is to use private properties to prevent unintended modifications to the balance while allowing controlled access through methods.

  1. Private Balance Property:
    • Inside the BankAccount class, declare a private property #balance.
  2. Constructor:
    • The constructor should accept owner and initialBalance as parameters;
    • Assign owner to a public property and initialBalance to the private #balance property.
  3. Add Methods:
    • deposit: Define a method that takes amount as a parameter. If the amount is greater than 0, it should add amount to #balance;
    • withdraw: Define a method that takes amount as a parameter. If the amount is greater than 0 and less than or equal to #balance, it should subtract amount from #balance;
    • getBalance: Define a method that returns a string with the owner's name and the account balance, e.g., "Account balance for John: $1500".
123456789101112131415161718192021222324252627282930313233343536
class BankAccount { #_____; // Declare private property constructor(owner, initialBalance) { this._____ = owner; this.#_____ = initialBalance; } deposit(_____) { if (_____) { this.#_____ += _____; } } withdraw(_____) { if (_____ && _____) { this.#_____ -= _____; } } getBalance() { return `Account balance for ${this._____}: $${this.#_____}`; } } // Testing const account1 = new BankAccount('Alice', 1000); account1.deposit(500); console.log(account1.getBalance()); // Expected: Account balance for Alice: $1500 account1.withdraw(300); console.log(account1.getBalance()); // Expected: Account balance for Alice: $1200 // Attempt direct access (should cause an error) // console.log(account1.#balance);
copy
  • Declare a private property #balance in the BankAccount class;
  • In the constructor, assign owner to a public property and initialBalance to the private #balance property;
  • Define a deposit method that takes amount as a parameter. Check if amount is greater than 0, then add amount to #balance;
  • Define a withdraw method that takes amount as a parameter. Check if amount is greater than 0 and less than or equal to #balance, then subtract amount from #balance;
  • Define a getBalance method that returns a string with the owner's name and the account balance.
123456789101112131415161718192021222324252627282930313233343536
class BankAccount { #balance; // Declare private property constructor(owner, initialBalance) { this.owner = owner; this.#balance = initialBalance; } deposit(amount) { if (amount > 0) { this.#balance += amount; } } withdraw(amount) { if (amount > 0 && amount <= this.#balance) { this.#balance -= amount; } } getBalance() { return `Account balance for ${this.owner}: $${this.#balance}`; } } // Testing const account1 = new BankAccount('Alice', 1000); account1.deposit(500); console.log(account1.getBalance()); // Output: Account balance for Alice: $1500 account1.withdraw(300); console.log(account1.getBalance()); // Output: Account balance for Alice: $1200 // Attempt direct access (should cause an error) // console.log(account1.#balance);
copy

Everything was clear?

How can we improve it?

Thanks for your feedback!

Section 1. Chapter 8
some-alt