2009-09-28 40 views
42

Làm cách nào để kiểm tra xem đối tượng javascript của tôi có thuộc loại nhất định hay không.Loại Javascript của đối tượng tùy chỉnh

var SomeObject = function() { } 
var s1 = new SomeObject(); 

Trong trường hợp trên typeof s1 sẽ trả về "đối tượng". Điều đó không hữu ích lắm. Có cách nào để kiểm tra xem s1 có thuộc loại SomeObject không?

Trả lời

65

Vâng, sử dụng instanceof (MDN link | spec link):

if (s1 instanceof SomeObject) { ... } 
+0

Thật vậy, nó đi lại cho JavaScript phiên bản sớm nhất trong Netscape 2.0. (Một lý do khác không liên kết với ECMA-262 là nó không rõ ràng và không đọc được, ngay cả theo tiêu chuẩn tài liệu tiêu chuẩn!) – bobince

+0

@bobince: Phải mất một số làm quen với phong cách. :-) –

+0

@bobince: Nhìn vào thông số ES6 ... tốt ... chúng ta hãy nói rằng bây giờ tôi đang tích cực pining cho những ngày vinh quang của sự rõ ràng trong spec ES5. :-) –

3

Idea bị đánh cắp từ http://phpjs.org/functions/get_class/, được đăng bởi SeanJA. Ripped xuống để làm việc với các đối tượng chỉ và không có nhu cầu về một biểu thức chính quy:

function GetInstanceType(obj) 
{ 
    var str = obj.constructor.toString(); 
    return str.substring(9, str.indexOf("(")); 
} 

function Foo() { 
    this.abc = 123; 
} 

// will print "Foo" 
GetInstanceType(new Foo()); 

Tôi chỉ học được một cách dễ dàng hơn để trích xuất các tên hàm từ các nhà xây dựng:

obj.constructor.name 
10

Dù bạn làm gì, tránh obj .constructor.name hoặc bất kỳ phiên bản chuỗi nào của hàm tạo. Đó là hoạt động tuyệt vời cho đến khi bạn làm xấu đi/rút gọn mã của bạn, sau đó nó tất cả phá vỡ kể từ khi các nhà xây dựng được đổi tên thành một cái gì đó mơ hồ (ví dụ: 'n') và mã của bạn vẫn sẽ làm điều này và không bao giờ phù hợp:

// Note: when uglified, the constructor may be renamed to 'n' (or whatever), 
// which breaks this code since the strings are left alone. 
if (obj.constructor.name === 'SomeObject') {} 

Lưu ý:

// Even if uglified/minified, this will work since SomeObject will 
// universally be changed to something like 'n'. 
if (obj instanceof SomeObject) {} 

(BTW, tôi cần danh tiếng cao hơn để nhận xét về câu trả lời xứng đáng khác ở đây)

+2

[Xem liên kết này] (http://engblog.yext.com/post/js-type-checking). Thuộc tính hàm tạo là một cách thú vị khác để thực hiện. Chỉ cần tiếp tục tránh tiếp cận chuỗi. – AAron

Các vấn đề liên quan