Bạn có thể sử dụng Object.getOwnPropertyNames()
để có được tất cả các thuộc tính thuộc về một đối tượng, cho dù có thể đếm được hay không. Ví dụ:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
Sau đó, bạn có thể sử dụng filter()
để chỉ lấy các phương thức:
console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]
Trong các trình duyệt ES3 (IE 8 trở xuống), các thuộc tính của các đối tượng tích hợp không thể đếm được. Đối tượng thích window
vàdocument
không tích hợp, chúng được xác định bởi trình duyệt và rất có thể là vô số theo thiết kế.
Từ ECMA-262 Phiên bản 3 :
Đối tượng toàn cầu
Có một đối tượng toàn cầu duy nhất (15.1), được tạo trước khi điều khiển đi vào bất kỳ bối cảnh thực hiện nào. Ban đầu đối tượng toàn cầu có các thuộc tính sau:
• Các đối tượng tích hợp sẵn như Math, String, Date, parseInt, v.v ... Chúng có các thuộc tính {DontEnum} .
• Thuộc tính máy chủ bổ sung được xác định. Điều này có thể bao gồm một tài sản có giá trị là chính đối tượng toàn cầu; ví dụ, trong mô hình đối tượng tài liệu HTML, thuộc tính cửa sổ của đối tượng toàn cục là chính đối tượng toàn cục.
Khi điều khiển đi vào bối cảnh thực thi và khi mã ECMAScript được thực thi, các thuộc tính bổ sung có thể được thêm vào đối tượng toàn cục và các thuộc tính ban đầu có thể được thay đổi.
Tôi nên chỉ ra rằng điều này có nghĩa là những đối tượng đó không phải là vô số thuộc tính của đối tượng Toàn cầu. Nếu bạn xem qua phần còn lại của tài liệu đặc tả, bạn sẽ thấy hầu hết các thuộc tính và phương thức dựng sẵn của các đối tượng này có { DontEnum }
thuộc tính được đặt trên chúng.
Cập nhật: một người dùng SO đồng nghiệp, CMS, đã mang đến một lỗi IE liên quan{ DontEnum }
đến sự chú ý của tôi.
Thay vì kiểm tra thuộc tính DontEnum, [Microsoft] JScript sẽ bỏ qua bất kỳ thuộc tính nào trong bất kỳ đối tượng nào có thuộc tính cùng tên trong chuỗi nguyên mẫu của đối tượng có thuộc tính DontEnum.
Tóm lại, hãy cẩn thận khi đặt tên thuộc tính đối tượng của bạn. Nếu có một thuộc tính hoặc phương thức nguyên mẫu tích hợp có cùng tên thì IE sẽ bỏ qua nó khi sử dụng một for...in
vòng lặp.