Skip to main content

Accessors, Events & Phần khác

Accessors​

Không bắt buộc phải có accessor cho mọi property​

Tránh getter/setter; nếu cần thì dùng getVal() / setVal('hello')​

Getter/setter gây side effect khó đoán và khó test.

Property/method boolean: dùng isVal() hoặc hasVal()​

// ✅ Tốt
if (!dragon.hasAge()) {
return false;
}

Có thể dùng get()/set() chung; đặt tên nhất quán​


Events​

Gắn data vào event: truyền object literal (hash), không truyền giá trị thô​

Để sau này thêm field không phải sửa mọi handler.

// ✅ Tốt
$(this).trigger("listingUpdated", { listingID: listing.id });
$(this).on("listingUpdated", (e, data) => {
// do something with data.listingID
});

jQuery​

Biến chứa jQuery object: prefix $​

// ✅ Tốt
const $sidebar = $(".sidebar");

Cache jQuery lookup, không gọi $('.sidebar') nhiều lần​

Query DOM: dùng cascade $('.sidebar ul') hoặc parent > child $('.sidebar > ul')​

Dùng find với jQuery object đã scope​

// ✅ Tốt
$sidebar.find("ul").hide();

Iterators and Generators​

Ưu tiên higher-order functions (map/every/filter/find/reduce/some/…) thay vì for-in/for-of​

// best
const sum = numbers.reduce((total, num) => total + num, 0);
const increasedByOne = numbers.map((num) => num + 1);

Hiện tại không khuyến nghị dùng generator (transpile sang ES5 kém)​

Nếu dùng generator: khoảng cách đúng giữa function và * — function* foo() { }​


Standard Library​

Dùng Number.isNaN thay vì global isNaN​

Global isNaN ép kiểu; Number.isNaN chỉ true khi giá trị thực sự là NaN.

Dùng Number.isFinite thay vì global isFinite​


Testing​

Nên viết test​

Ưu tiên nhiều hàm nhỏ, thuần; giảm mutation​

Cẩn thận với stub/mock — dễ làm test dễ vỡ​

Khi sửa bug: thêm regression test​