Tôi đã dành 10 hoặc 20 phút ở đây và có thể một chục lần trong năm qua và không bao giờ tìm thấy một câu trả lời chống đạn cho câu hỏi này.Làm thế nào để bạn kiểm tra xem một đối tượng JavaScript có trực tiếp là một cá thể `{}`, không phải là một phân lớp không?
Làm cách nào để kiểm tra xem đối tượng JavaScript có phải là một thể hiện của Object
, không phải là phân lớp không?
Một trường hợp sử dụng cho điều này là để kiểm tra xem arguments[0]
là một "tùy chọn" băm so với "mô hình" (MVC), cả hai đều mở rộng Object
gốc, nhưng sẽ được xử lý khác nhau.
Tôi đã thử các:
// some helper to get constructor name
function klassName(fn) {
if (fn.__name__) {
return fn.__name__;
}
if (fn.name) {
return fn.name;
}
return fn.toString().match(/\W*function\s+([\w\$]+)\(/));
};
var Model = function() {};
m = new Model;
o = {};
Object(o) === o; // true
Object(m) === m; // true, thought it might be false
klassName(o.constructor); // Object
klassName(m.constructor); // Model
Đó klassName(m.constructor)
không hoạt động trong một số trường hợp (không thể nhớ chính xác, nhưng có lẽ một regex.constructor, một cái gì đó như thế). Có lẽ nó, không biết chắc chắn.
Có cách nào chống đạn để cho biết có vật gì là đối tượng {}
không?
Trong JavaScript có gì là chống đạn. Không, ngay cả bản thân chức năng 'Bulletproof'. :) –
BTW - JavaScript không có ** subclass ** per-se. Chỉ có hàm xây dựng và nguyên mẫu. – gnarf