Promise chỉ là một vật thể để việc lập trình được tiện hơn, không phải là một tính năng mà những phiên bản JS trước không làm được

Lớp là một cái khuôn để tạo các vật thể cho nhanh. Thông thường để tạo một vật thể mới qua một lớp ta dùng thế này:

const xeMáy = new Xe('2 bánh')
const ôTô   = new Xe('4 bánh')
const xeTải = new Xe('12 bánh')
//    ^ vật thể   ^ Lớp

Promise là một vật thể, và nó được tạo ra từ lớp Promise. Lớp này không nhận đối số là chuỗi như bình thường mà là cả một hàm:

const promise = new Promise(hàmThựcThi)
//    ^ vật thể     ^ Lớp

Hàm này sẽ được thực thi ngay khi bạn khai báo mà không cần bạn phải gọi nó thực thi như thông thường:

function hàmBìnhThường(){} // chỉ mới khai báo, chưa thực thi
hàmBìnhThường() // Tới lúc này mới thực thi

const promise = new Promise(hàmThựcThi) // hàmThựcThi() được thực thi ngay tại dòng này

Hàm thực thi này được quy định là có 2 đối số. 2 đối số này đến lượt nó lại là 2 hàm khác. Hàm đầu tiên có tên là resolve còn hàm sau thì có tên là reject:
function hàmThựcThi(resolve, reject) {} 

Vật thể promise có 2 thuộc tính là state và result, và 3 phương thức là then, catch, và finally
Vật thể promise sau khi được tạo ra từ lớp Promise sẽ có 3 phương thức: then, catch, finally.

fetch("https://jsonplaceholder.typicode.com/todos/1")
.then(res => res.json())
.then(d => console.log(d))

Phương thức cho ta biết mình có thể làm gì với vật thể