Gọi new Foo() khiến JavaScript làm bốn việc theo thứ tự:
javascript
function Person(name) {
// 1. một object rỗng được tạo
// 2. prototype của nó = Person.prototype
// 3. this = object đó, rồi thân hàm chạy
this.name = name
// 4. tự động return this — trừ khi bạn return một object khác
}
const p = new Person('Định')
p.name // 'Định'
Object.getPrototypeOf(p) === Person.prototype // trueTự cài lại new để thấy rõ:
javascript
function myNew(Ctor, ...args) {
const obj = Object.create(Ctor.prototype) // bước 1 + 2
const ret = Ctor.apply(obj, args) // bước 3
return typeof ret === 'object' && ret !== null ? ret : obj // bước 4
}Quy tắc ở bước 4 hay bị hỏi: return giá trị nguyên thuỷ thì bị bỏ qua, chỉ return object mới ghi đè được this.
javascript
function A() { this.x = 1; return 42 } // bỏ qua → { x: 1 }
function B() { this.x = 1; return { y: 2 } } // ghi đè → { y: 2 }Lưu ý: quên new với constructor kiểu function — this thành undefined (strict) hoặc globalThis (sloppy), và code âm thầm ghi biến ra global thay vì báo lỗi.
Đây là một lý do class ra đời: gọi class mà thiếu new thì ném TypeError ngay.