Xác định đối tượng nào là is complicated trong JavaScript và tìm ra đối tượng nào là mảng có thứ gì đó trong số hacky solution. May mắn thay, nó quản lý để làm việc trong cả hai trường hợp sau đây:Có thể xác định xem một đối tượng được tạo với Object.create kế thừa từ Array trong JavaScript không?
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call(new Array()); // [object Array]
Tuyệt vời, không [object Object]
trong tầm nhìn! Đáng buồn thay, phương pháp này vẫn quản lý để thất bại với điều này:
var arr = Object.create(Array.prototype);
Object.prototype.toString.call(arr); // [object Object]
Điều này là bực bội, vì vậy hãy nói ít nhất. Đối tượng arr
của tôi có tất cả các phương thức của một mảng, nó hoạt động như một mảng và cho tất cả các mục đích, nó là một mảng. Tuy nhiên, JavaScript không cung cấp các công cụ để xác định nó như vậy.
Có cách nào để tìm hiểu xem một đối tượng có được kế thừa từ một mẫu thử nghiệm cụ thể không? Tôi cho rằng bạn có thể lặp qua các nguyên mẫu như vậy:
function inherits(obj, proto) {
while (obj != null) {
if (obj == proto) return true;
obj = Object.getPrototypeOf(obj);
}
return false;
}
inherits(Object.create(Array.prototype), Array.prototype); // true
Nhưng nó cảm thấy một chút tẻ nhạt. Có cách tiếp cận nào sạch hơn không?
Tôi chỉ tò mò: tại sao bạn lại tạo một mảng như thế này? 'Object.create (Array.prototyp);' và kiểm tra nó thông qua 'Object.prototype.toString.call (arr);' – Zim84
@ Zim84: Tôi nghĩ đây chỉ là một ví dụ. Trong các ứng dụng thực tế, chúng ta không bao giờ nên làm điều này. Trong các ứng dụng thực tế, Object.create (Array.prototype) có thể được gọi ở một nơi khác và truyền đối tượng đã tạo tới một hàm khác –
Vấn đề là bạn không thực sự có một mảng thực (ví dụ nó không có phép thuật ' length' tài sản, chỉ là một trong đó trông giống như nó ở cái nhìn đầu tiên). Những gì bạn có là một mảng giống như chỉ xảy ra để có tất cả các phương thức của một mảng thực. Nếu bạn muốn kiểm tra các mảng thích, bạn nên tìm hiểu xem nó có thuộc tính 'length' và không phải là một chuỗi hay không. Đó là IMO tốt nhất. Nếu bạn muốn kiểm tra các mảng thực, hãy tiếp tục sử dụng 'Object.prototype.toString.call' hoặc' Array.isArray' và biết rằng một đối tượng có nguyên mẫu 'Array.prototype' không nhất thiết là một mảng đúng. –