2012-04-25 44 views
12

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?

+1

Trong JavaScript có gì là chống đạn. Không, ngay cả bản thân chức năng 'Bulletproof'. :) –

+1

BTW - JavaScript không có ** subclass ** per-se. Chỉ có hàm xây dựng và nguyên mẫu. – gnarf

Trả lời

11

Might một cái gì đó đơn giản như

function isObj(test) { 
    return test.constructor === Object; 
} 

Be những gì bạn đang tìm kiếm?

Test in jsFiddle

+0

Điều đó có hiệu quả. Tôi chỉ đang thử một cái gì đó tương tự để cập nhật câu trả lời của tôi. Điều này không hoạt động. Nó có chống đạn không? – elclanrs

+0

@elclanrs - Tôi khuyên bạn nên sử dụng [browserstack] (http://browserstack.com) để kiểm tra từng trình duyệt được nhắm mục tiêu của bạn. – gnarf

+0

@elclanrs - Nếu nó không hoạt động ở đâu đó, tôi sẽ xem liệu tôi có thể đưa nó vào câu trả lời hay không. Tôi đã thử nghiệm nó trong IE 6-9 & Chrome, Firefox, Opera mới nhất. Điều này sẽ làm việc cho hầu hết các trường hợp. – gnarf

1

Ý bạn là gì? http://jsfiddle.net/elclanrs/ukEEw/

var o = {}; 
var re = /\d/; 
var f = function(){}; 
var d = new Date(); 

var isObj = function(e){ 
    return e.toString() === '[object Object]'; 
}; 

console.log(isObj(o)); // True 
console.log(isObj(re)); // False 
console.log(isObj(f)); // False 
console.log(isObj(d)); // False 

+0

Hãy xem xét việc sử dụng 'Object.prototype.toString.call (obj)' thay vì chỉ 'obj.toString()' – gnarf

+0

'isObj (Mô hình mới); // true' –

0

Tôi chỉ có thể thay đổi một điều

var isObj = function(e){ 
    if(!e) return false; // change this line 
    return e.toString() === '[object Object]'; 
}; 
Các vấn đề liên quan