javascript
37 lines · 7 steps
Building a Stack with private fields
A clean LIFO stack in JavaScript using a private field, chainable pushes, and a custom iterator.
Explained by
highlit
1class Stack {
2 #items = [];
3
4 push(value) {
5 this.#items.push(value);
6 return this;
7 }
8
9 pop() {
10 if (this.isEmpty()) {
11 throw new Error("Stack underflow");
12 }
13 return this.#items.pop();
14 }
15
16 peek() {
17 return this.#items[this.#items.length - 1];
18 }
19
20 isEmpty() {
21 return this.#items.length === 0;
22 }
23
24 get size() {
25 return this.#items.length;
26 }
27
28 clear() {
29 this.#items.length = 0;
30 }
31
32 *[Symbol.iterator]() {
33 for (let i = this.#items.length - 1; i >= 0; i--) {
34 yield this.#items[i];
35 }
36 }
37}
01 / 01
STEP 01
‹ swipe to step through ›
Walkthrough
Space play
←→ step
click any line
Three takeaways
- 1Private fields (#) enforce true encapsulation so internal state can't be touched from outside.
- 2Returning this from mutating methods enables fluent, chainable call syntax.
- 3Implementing Symbol.iterator makes a custom class work with for...of and spread.
Related explainers
javascript
function evaluate(expression) { const tokens = tokenize(expression); let pos = 0;
Building a recursive descent calculator
parsing
recursion
operator-precedence
Intermediate
8 steps
rust
use std::f64::consts::PI; #[derive(Debug, Clone, Copy)] pub struct LatLng {
Building geographic bounding boxes in Rust
geospatial
value-types
option
Intermediate
7 steps
javascript
import { useState, useEffect, useCallback, useRef } from 'react'; const cache = new Map(); const inflight = new Map();
Building a stale-while-revalidate hook in React
caching
request-deduplication
custom-hooks
Advanced
10 steps
python
import random from typing import Iterator, List
How reservoir sampling picks k items
reservoir-sampling
streaming
randomness
Intermediate
5 steps
rust
use chrono::{Duration, NaiveDate}; #[derive(Debug)] pub struct DateRange {
Parsing and iterating date ranges in Rust
error-handling
iterators
parsing
Intermediate
7 steps
javascript
import { useEffect, useRef, useState } from 'react'; export function useDelayedFlag(active, delay = 300) { const [visible, setVisible] = useState(false);
Delaying a loading spinner with a React hook
custom-hooks
debouncing
cleanup
Intermediate
8 steps
Share this explainer
Here's the card — post it anywhere.
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code
Embed this explainer
Drop the interactive walkthrough into a blog or docs. Views never cost a credit.
<iframe src="https://highlit.co/explainers/building-a-stack-with-private-fields-explained-javascript-5d42/embed?autoplay=1" width="100%" height="520" loading="lazy" style="border:0"></iframe>
Autoplay is on by default — add ?autoplay=0 to start paused.