Skip to content

Commit 72d64d5

Browse files
committed
feat: add private fields and default parameters to classes, update README and tests
1 parent ad6bc25 commit 72d64d5

11 files changed

Lines changed: 71 additions & 62 deletions

File tree

exercises/01.classes/02.problem.constructors/README.mdx

Lines changed: 0 additions & 49 deletions
This file was deleted.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Private Fields and Defaults
2+
3+
👨‍💼 Classes can hide implementation details using private fields and provide
4+
flexibility with default parameter values.
5+
6+
## Private Fields
7+
8+
JavaScript has native private fields using the `#` prefix. These fields are
9+
truly private—they can only be accessed inside the class:
10+
11+
```ts
12+
class BankAccount {
13+
#balance: number = 0 // Truly private - not accessible outside the class
14+
15+
deposit(amount: number) {
16+
this.#balance += amount
17+
}
18+
}
19+
20+
const account = new BankAccount()
21+
account.#balance // ❌ Error! Private field not accessible
22+
```
23+
24+
Private fields enable **encapsulation**—hiding internal implementation details
25+
from code outside the class. This prevents accidental modification and makes
26+
your code more maintainable.
27+
28+
## Default Parameter Values
29+
30+
Constructors can use default parameter values to make some parameters optional:
31+
32+
```ts
33+
class User {
34+
name: string
35+
role: string
36+
37+
constructor(name: string, role: string = 'user') {
38+
this.name = name
39+
this.role = role
40+
}
41+
}
42+
43+
const user = new User('Alice') // role defaults to 'user'
44+
const admin = new User('Bob', 'admin') // role explicitly set
45+
```
46+
47+
🐨 Open <InlineFile file="index.ts" /> and:
48+
49+
1. Use `#` prefix to create private fields
50+
2. Use default parameter values in constructors
51+
3. Create classes that encapsulate their internal state
52+
53+
💰 Use `#` to declare a private field—it's truly private, not just a convention.
54+
55+
💰 Default parameters let you create flexible constructors with sensible defaults.
56+
57+
📜 [MDN - Private class features](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields)

exercises/01.classes/02.problem.constructors/index.ts renamed to exercises/01.classes/02.problem.private-fields-and-defaults/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
// Constructor Patterns
2-
// 🦉 This runtime does not support parameter property shorthand.
1+
// Private Fields and Defaults
32

43
// 🐨 Create a User class with these fields:
54
// - name: string

exercises/01.classes/02.solution.constructors/package.json renamed to exercises/01.classes/02.problem.private-fields-and-defaults/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "exercises_01.classes_02.solution.constructors",
2+
"name": "exercises_01.classes_02.problem.private-fields-and-defaults",
33
"type": "module",
44
"scripts": {
55
"start": "npx @kentcdodds/log-module@latest ./index.ts",

exercises/01.classes/02.solution.constructors/README.mdx

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Private Fields and Defaults
2+
3+
👨‍💼 Great work using private fields and default values!
4+
5+
🦉 Private fields (`#`) provide true encapsulation—they're not accessible
6+
outside the class, preventing accidental modification of internal state. Default
7+
parameter values make your constructors flexible while keeping the code clean.

exercises/01.classes/02.solution.constructors/index.test.ts renamed to exercises/01.classes/02.solution.private-fields-and-defaults/index.test.ts

File renamed without changes.

exercises/01.classes/02.solution.constructors/index.ts renamed to exercises/01.classes/02.solution.private-fields-and-defaults/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Constructor Patterns
1+
// Private Fields and Defaults
22

33
class User {
44
name: string

exercises/01.classes/02.problem.constructors/package.json renamed to exercises/01.classes/02.solution.private-fields-and-defaults/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "exercises_01.classes_02.problem.constructors",
2+
"name": "exercises_01.classes_02.solution.private-fields-and-defaults",
33
"type": "module",
44
"scripts": {
55
"start": "npx @kentcdodds/log-module@latest ./index.ts",

exercises/01.classes/FINISHED.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ You learned:
77
- 📦 **Fields** store data on instances
88
- 🔧 **Methods** define behavior
99
- 🏗️ **Constructors** initialize new instances
10-
-**Parameter properties** as a shorthand
10+
- 🔒 **Private fields** (`#`) encapsulate internal state
11+
- ⚙️ **Default parameters** make constructors flexible
1112

1213
🦉 Classes vs plain objects: Use classes when you need:
1314

0 commit comments

Comments
 (0)