2011-12-29 35 views
8

Tôi tò mò muốn biết có cách nào giả mạo Array.isArray() với đối tượng do người dùng xác định hay không.Bạn có thể giả mạo Array.isArray() với đối tượng do người dùng xác định không?

Từ cuốn sách Patterns JavaScript:

Array.isArray([]); // true 

// trying to fool the check 
// with an array-like object 
Array.isArray({ 
    length: 1, 
    "0": 1, 
    slice: function() {} 
}); // false 

Đó phản đối rõ ràng thất bại, nhưng là có cách nào khác để làm điều đó? Đây là sự tò mò tuyệt đối, và không phải vì tôi nghĩ rằng bạn có thể vặn với .isArray() trong mã máy khách thông thường (mặc dù nó rõ ràng sẽ là tuyệt vời để biết nếu bạn có thể!).

Trả lời

9

Chỉ khi bạn đặt internal [[Class]] property thành "Array", điều này không thể thực hiện được. Từ specification:

Chức năng isArray mất một đối số arg, và trả về giá trị Boolean true nếu đối số là một đối tượng có lớp tài sản nội bộ là "mảng"; nếu không nó sẽ trả về false.

Hoặc bạn đi theo cách khác vòng: Tạo một mảng bình thường và đặt rõ ràng mọi phương thức mảng thành undefined.

+0

Bây giờ bạn đã nhắc nhở tôi để hỏi một câu hỏi tiếp theo vào lúc: http://stackoverflow.com/questions/8672204/can- bạn-set-the-internal-class-property-of-an-ecmascript-object –

10

Array.isArray = function() { return true; }

Và nếu bạn muốn trở thành nghịch ngợm

Array.isArray.toString = function() { 
    return 'function() { [native code] }'; 
}; 
+0

Cả hai giải pháp đều khá nghịch ngợm. Đây là một thay đổi toàn cầu có thể phá vỡ các phần khác của trang web/ứng dụng. –

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