2011-12-09 23 views
23

xem xét như một đối tượng với một chuỗi nguyên mẫu:instanceof tương đương cho Object.create và nguyên mẫu chuỗi

var A = {}; 
var B = Object.create(A); 
var C = Object.create(B); 

Làm thế nào để kiểm tra trong thời gian chạy nếu C có A trong chuỗi nguyên mẫu của nó?

instanceof không phù hợp vì nó được thiết kế để hoạt động với hàm hàm tạo, mà tôi không sử dụng ở đây.

Trả lời

21

câu trả lời của tôi sẽ là ngắn ...

Bạn có thể sử dụng phương pháp isPrototypeOf, mà sẽ có mặt trong trường hợp đối tượng của bạn được thừa hưởng từ nguyên mẫu Object, như ví dụ của bạn.

dụ:

A.isPrototypeOf(C) // true 
B.isPrototypeOf(C) // true 
Array.prototype.isPrototypeOf(C) // false 

Thông tin thêm có thể được đọc ở đây: Mozilla Developer Network: isPrototypeOf

+1

+1 Giải pháp đơn giản. Mặc dù các ví dụ của bạn là hoàn toàn chính xác, nó sẽ là 'Array.prototype.isPrototypeOf (C)' để kiểm tra xem 'C' là một mảng (tôi đã tìm thấy ví dụ cuối cùng của bạn một chút mơ hồ) bằng cách sử dụng' isPrototypeOf' trên một hàm thường không bạn muốn gì). – pimvdb

+0

Bạn hoàn toàn đúng, tôi không muốn mất quá nhiều thời gian vì câu trả lời đã được đưa ra vào thời điểm đó, vì vậy tôi không nghĩ quá nhiều vào các ví dụ, mục tiêu của tôi là chỉ hiển thị phương thức có sẵn .. Tôi vẫn sẽ sửa lại ví dụ được đưa ra với câu trả lời của bạn, vì như bạn đã nói và tôi đồng ý, ví dụ cuối cùng của tôi là mơ hồ, cảm ơn thông báo =) – Couto

+0

Chỉ cần một câu hỏi nhanh: làm thế nào để đối tượng không được kế thừa từ Object? Bất kỳ đối tượng nào cũng có tham chiếu [[Prototype]] thông qua chuỗi các nguyên mẫu cuối cùng dẫn đến Object.prototype. –

4

Bạn có thể lặp lại qua chuỗi nguyên mẫu bằng cách gọi Object.getPrototypeOf đệ quy: http://jsfiddle.net/Xdze8/.

function isInPrototypeChain(topMost, itemToSearchFor) { 
    var p = topMost; 

    do { 

     if(p === itemToSearchFor) { 
      return true; 
     } 

     p = Object.getPrototypeOf(p); // prototype of current 

    } while(p); // while not null (after last chain) 

    return false; // only get here if the `if` clause was never passed, so not found in chain 
} 
+0

1 sắp sửa viết gần * giống hệt * câu trả lời, ngay cả với các 'làm-while', mà tôi don' t thấy quá thường xuyên. Nhưng của bạn được tạo thành một hàm, đẹp hơn. – RightSaidFred

+0

@RightSaidFred: Funny, tôi cũng nghĩ về việc tôi đang sử dụng từ khóa 'do' mà tôi gần như không bao giờ làm. – pimvdb

+0

Tôi rất ngạc nhiên khi không có đề xuất 'Object.hasPrototype' cho ES6 thực hiện chính xác chức năng của bạn. Nó chỉ có vẻ là một bổ sung tự nhiên 'Object.create' như' instanceof' là 'new Constructor'. Nó thậm chí có thể chấp nhận một hàm làm đối số thứ hai, nó sẽ sử dụng 'prototype' của hàm làm đích. – RightSaidFred

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