Toán tử instanceof được nhắm mục tiêu kiểm tra xem một đối tượng có thuộc về một lớp cụ thể hay không. Nó cũng giúp tính đến việc thừa kế
Bây giờ, hãy sử dụng nó để xây dựng một hàm đa hình, xử lý các đối số khác nhau tùy thuộc vào loại của chúng
Cú pháp sau đây được sử dụng cho toán tử instanceof
Nó có thể trả về true trong trường hợp đối tượng thuộc Lớp hoặc lớp kế thừa từ nó
Đây là một ví dụ
class Dog {} let dog = new Dog[]; . log[dog instanceof Dog];
Nó cũng có thể hoạt động với các hàm tạo
// thay cho class function Dog[] {} console. log[new Dog[] instanceof Dog];
Ngoài ra, nó hoạt động với các lớp dựng sẵn, chẳng hạn như Array
hãy mảng = [1, 2, 3]; . nhật ký [mảng cá thể của Mảng]; . nhật ký [đối tượng mảng đối tượng];
Vui lòng xem xét thuộc về lớp Đối tượng. Lý do là Array kế thừa nguyên mẫu từ Object
Theo quy định, instanceof nghiên cứu chuỗi nguyên mẫu để kiểm tra. Cũng có thể áp dụng logic tùy chỉnh bên trong phương thức tĩnh Biểu tượng. hasInstance
Thuật toán obj instanceof Class hoạt động như sau
// thiết lập instanceOf kiểm tra giả định rằng // bất kỳ thứ gì có thuộc tính canEat đều là động vật Lớp động vật { tĩnh [Symbol. hasInstance][obj] { if [obj. ăn] trả về đúng; . ĐÚNG VẬY }; . log[obj instanceof Animal]; . Động vật [Biểu tượng. hasInstance][obj] được gọi là
Vì vậy, nếu tồn tại một phương thức tĩnh Symbol. hasInstance, nó có thể được gọi là Class[Symbol. hasInstance][obj]. Nó có thể trả về true hoặc false
Nhưng hầu hết các trường hợp không bao gồm Biểu tượng. hasInstance. Trong những trường hợp như vậy, bạn cần tuân theo logic tiêu chuẩn. obj instanceOf Class sẽ kiểm tra xem Class. nguyên mẫu giống như một trong những nguyên mẫu trong chuỗi nguyên mẫu obj
Đây là một ví dụ
obj.__proto__ === Class.prototype ?
obj.__proto__.__proto__ === Class.prototype ?
obj.__proto__.__proto__.__proto__ === Class.prototype ?
...
// if any answer is true, return true
// otherwise, if we reach the end of the chain, return false
Trong ví dụ trên con chó. __proto__ === Con chó. nguyên mẫu, câu trả lời được đưa ra ngay lập tức
Nếu có thừa kế thì so khớp ở bước thứ hai, như sau
class Animal {} class Dog extends Animal {} let dog = new Dog[]; . log[dog instanceof Dog]; . __proto__ === Con chó. nguyên mẫu // con chó. __proto__. __proto__ === Động vật. nguyên mẫu
Hãy cùng xem hình ảnh minh họa bên dưới
Một phương pháp khác có thể được đánh dấu. Đó là objA. isPrototypeOf[objB], trả về true trong trường hợp objA nằm trong chuỗi nguyên mẫu và Lớp. vấn đề nguyên mẫu
Nó có thể dẫn đến kết quả phi thường khi thuộc tính nguyên mẫu được chuyển đổi sau khi đối tượng được tạo
Đây là một ví dụ
function Dog[] {} let dog = new Dog[]; . nguyên mẫu = {}; . bảng điều khiển. log[dog instanceof Dog];
Như đã lưu ý, các đối tượng đơn giản có thể được chuyển đổi thành một chuỗi dưới dạng [đối tượng đối tượng], như ở đây
cho obj = {}; . nhật ký [đối tượng]; . nhật ký [obj. toString[]];
Đó là việc họ thực hiện. Tuy nhiên, tồn tại một tính năng ẩn, làm cho toString trở nên mạnh mẽ hơn thế. Nó có thể được sử dụng như một kiểu mở rộng, cũng như một kiểu thay thế cho instanceof
ToString tích hợp có thể được trích xuất từ đối tượng, cũng như được thực thi trong ngữ cảnh của bất kỳ giá trị nào khác. Kết quả của nó phụ thuộc vào giá trị đó
- Nó có thể là [số đối tượng] cho một số
- Nó có thể là [đối tượng Boolean] cho một boolean
- Nó có thể là [đối tượng Null] cho null
- Nó có thể là [đối tượng không xác định] cho không xác định
- [mảng đối tượng]. cho mảng
Nó được thể hiện trong ví dụ dưới đây
// copy phương thức toString vào một biến cho tiện let objToString = Object. nguyên mẫu. toString; . nhật ký [objToString. cuộc gọi [mảng]];
Thuật toán toString khám phá điều này trả về kết quả tương ứng
Đây là một ví dụ khác
hãy để str = Đối tượng. nguyên mẫu. toString; . nhật ký [str. cuộc gọi [123]]; . nhật ký [str. cuộc gọi [null]]; . nhật ký [str. cuộc gọi [cảnh báo]];
Hành vi Object toString có thể được tùy chỉnh, áp dụng một thuộc tính đối tượng duy nhất là Biểu tượng. toStringTag
Ví dụ như sau
hãy để động vật = { [Ký hiệu. toStringTag]. "Động vật" }; . nhật ký [{}. toString. gọi [động vật]];
Có thuộc tính như vậy cho hầu hết các đối tượng dành riêng cho môi trường. Ví dụ
// toStringTag cho đối tượng và lớp dành riêng cho môi trường. bảng điều khiển. nhật ký [cửa sổ [Ký hiệu. toStringTag]]; . nhật ký [XMLHttpRequest. nguyên mẫu [Ký hiệu. toStringTag]]; . nhật ký [{}. toString. cuộc gọi [cửa sổ]]; . nhật ký [{}. toString. cuộc gọi [XMLHttpRequest mới []]];
Vì vậy, bạn có thể nhận thấy rằng kết quả là Biểu tượng. toStringTag được bao bọc trong [đối tượng. ]
Các {}. toString. cuộc gọi có thể được sử dụng thay vì instanceof cho các đối tượng tích hợp bất cứ khi nào cần nhận loại dưới dạng chuỗi thay vì chỉ kiểm tra