Function.prototype[Symbol.hasInstance]()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.
Phương thức [Symbol.hasInstance]() của các instance Function chỉ định quy trình mặc định để xác định xem một hàm constructor có nhận ra một đối tượng là instance của constructor đó hay không. Nó được gọi bởi toán tử instanceof.
Cú pháp
func[Symbol.hasInstance](value)
Tham số
value-
Đối tượng cần kiểm tra. Các giá trị primitive luôn trả về
false.
Giá trị trả về
true nếu func.prototype nằm trong chuỗi prototype của value; ngược lại là false. Luôn trả về false nếu value không phải đối tượng hoặc this không phải hàm. Nếu this là một bound function, trả về kết quả của kiểm tra instanceof trên value và hàm mục tiêu bên dưới.
Ngoại lệ
TypeError-
Ném ra nếu
thiskhông phải bound function vàthis.prototypekhông phải đối tượng.
Mô tả
Toán tử instanceof gọi phương thức [Symbol.hasInstance]() của vế phải bất cứ khi nào phương thức đó tồn tại. Vì tất cả các hàm đều kế thừa từ Function.prototype theo mặc định, chúng đều có phương thức [Symbol.hasInstance](), do đó hầu hết thời gian, phương thức Function.prototype[Symbol.hasInstance]() chỉ định hành vi của instanceof khi vế phải là một hàm. Phương thức này triển khai hành vi mặc định của toán tử instanceof (cùng thuật toán khi constructor không có phương thức [Symbol.hasInstance]()).
Không giống hầu hết các phương thức, thuộc tính Function.prototype[Symbol.hasInstance]() là non-configurable và non-writable. Đây là tính năng bảo mật để ngăn hàm mục tiêu cơ bản của bound function bị lộ ra ngoài. Xem câu trả lời Stack Overflow này để biết ví dụ.
Ví dụ
>Quay lại hành vi instanceof mặc định
Bạn hiếm khi cần gọi phương thức này trực tiếp. Thay vào đó, phương thức này được gọi bởi toán tử instanceof. Bạn nên mong đợi hai kết quả thường tương đương nhau.
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true
Bạn có thể muốn dùng phương thức này nếu muốn gọi hành vi instanceof mặc định, nhưng không biết liệu một constructor có phương thức [Symbol.hasInstance]() tùy chỉnh hay không.
class Foo {
static [Symbol.hasInstance](value) {
// A custom implementation
return false;
}
}
const foo = new Foo();
console.log(foo instanceof Foo); // false
console.log(Function.prototype[Symbol.hasInstance].call(Foo, foo)); // true
Đặc tả
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-function.prototype-%symbol.hasinstance%> |