Các toán từ
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
3 cho phép để kiểm tra xem một đối tượng thuộc về một lớp nhất định nào vậy. Nó cũng có tính kế thừa.Kiểm tra như vậy có thể cần thiết trong nhiều trường hợp. Ở đây chúng ta sẽ sử dụng nó để xây dựng một hàm đa hình , một hàm xử lý các đối số khác nhau tùy thuộc vào kiểu của chúng.
- 1. Toán tử instanceof
- 2. Phần thêm: Object.prototype.toString cho các kiểu
- 2.1. Symbol.toStringTag
- 3. Tóm lược
1. Toán tử instanceof
2. Phần thêm: Object.prototype.toString cho các kiểu
obj instanceof Class
2.1. Symbol.toStringTag
3. Tóm lược
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
Cú pháp là:
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
Nó trả về
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
4nếu class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
5thuộc về class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
6hoặc một lớp kế thừa từ nó.let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
Ví dụ:
Nó cũng hoạt động với các hàm xây dựng:
… và với các lớp dựng sẵn như
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
7:- Xin lưu ý rằng
8cũng thuộc về lớpclass Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
9. Đó là bởi vì nguyên mẫuclass Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
7 được thừa hưởng từclass Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
9.class Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact:
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/
// setup instanceOf check that assumes that
// anything with canEat property is an animal
class Animal {
static [Symbol.hasInstance][obj] {
if [obj.canEat] return true;
}
}
let obj = { canEat: true };
alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
Thông thường,
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
3kiểm tra một chuỗi nguyên mẫu. Chúng ta cũng có thể thiết lập một logic tùy chỉnh trong phương thức tĩnh
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
3.Thuật toán của các công trình
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
4 đại khái như sau: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 reached the end of the chain, return false
Nếu có một phương thức tĩnh
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
3, thì chỉ cần gọi nó :
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
6. Nó sẽ trả lại class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
4hoặc
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
8, và chúng ta đã hoàn thành. Đó là cách chúng ta có thể tùy chỉnh hành vi của class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
3. Ví dụ: Hầu hết các lớp không có
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
3. Trong trường hợp đó, logic chuẩn được sử dụng: let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
1để kiểm tra xem let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
2có bằng một trong các nguyên mẫu trong chuỗi nguyên mẫu củaclass Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
5 hay không.class Animal {}
class Rabbit extends Animal {}
let rabbit = new Rabbit[];
alert[rabbit instanceof Animal]; // true
// rabbit.__proto__ === Rabbit.prototype
// rabbit.__proto__.__proto__ === Animal.prototype [match!]
Nói cách khác, so sánh cái này với cái khác:
Trong ví dụ trên
let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
4, do đó đưa ra câu trả lời ngay lập tức.Trong trường hợp thừa kế, sẽ ở bước thứ hai:
Dưới đây là minh họa về những gì
let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
5so sánh với let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
6:Nhân tiện, cũng có một phương thức objA.isPrototypeOf[objB], trả về
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
4nếu let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
8có ở đâu đó trong chuỗi các nguyên mẫu của let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
9. Vì vậy, bài kiểm tra
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
4có thể được như /*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact:
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/
// setup instanceOf check that assumes that
// anything with canEat property is an animal
class Animal {
static [Symbol.hasInstance][obj] {
if [obj.canEat] return true;
}
}
let obj = { canEat: true };
alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
1.function Rabbit[] {}
let rabbit = new Rabbit[];
// changed the prototype
Rabbit.prototype = {};
// ...not a rabbit any more!
alert[ rabbit instanceof Rabbit ]; // false
2. Phần thêm: Object.prototype.toString cho các kiểuPhần thêm: Object.prototype.toString cho các kiểu
2.1. Symbol.toStringTag
let obj = {};
alert[obj]; // [object Object]
alert[obj.toString[]]; // the same
3. Tóm lược
Cú pháp là:
Nó trả về
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
4nếu class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
5thuộc về class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
6hoặc một lớp kế thừa từ nó.- Ví dụ:
- Nó cũng hoạt động với các hàm xây dựng:
- … và với các lớp dựng sẵn như
7:class Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
- Xin lưu ý rằng
8cũng thuộc về lớpclass Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
9. Đó là bởi vì nguyên mẫuclass Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
7 được thừa hưởng từclass Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
9.class Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
- Thông thường,
3kiểm tra một chuỗi nguyên mẫu. Chúng ta cũng có thể thiết lập một logic tùy chỉnh trong phương thức tĩnhclass Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
3.// instead of class function Rabbit[] {} alert[ new Rabbit[] instanceof Rabbit ]; // true
- Thuật toán của các công trình
4 đại khái như sau:// instead of class function Rabbit[] {} alert[ new Rabbit[] instanceof Rabbit ]; // true
Nếu có một phương thức tĩnh
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
3, thì chỉ cần gọi nó :
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
6. Nó sẽ trả lại class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
4hoặc
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
8, và chúng ta đã hoàn thành. Đó là cách chúng ta có thể tùy chỉnh hành vi của class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
3. Ví dụ: // copy toString method into a variable for convenience
let objectToString = Object.prototype.toString;
// what type is this?
let arr = [];
alert[ objectToString.call[arr] ]; // [object Array]
Hầu hết các lớp không có
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
3. Trong trường hợp đó, logic chuẩn được sử dụng: let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
1để kiểm tra xem let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
2có bằng một trong các nguyên mẫu trong chuỗi nguyên mẫu củaclass Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
5 hay không.Nói cách khác, so sánh cái này với cái khác:
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
02.1. Symbol.toStringTagSymbol.toStringTag
3. Tóm lược
3. Tóm lược
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
1Cú pháp là:
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
2Nó trả về
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
4nếu class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
5thuộc về class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
6hoặc một lớp kế thừa từ nó.Ví dụ:
Nó cũng hoạt động với các hàm xây dựng:
… và với các lớp dựng sẵn như
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
7:
Thuật toán của các công trình 4 đại khái như sau: | Nếu có một phương thức tĩnh 3, thì chỉ cần gọi nó : 6. Nó sẽ trả lại 4hoặc 8, và chúng ta đã hoàn thành. Đó là cách chúng ta có thể tùy chỉnh hành vi của 3. Ví dụ: | Hầu hết các lớp không có 3. Trong trường hợp đó, logic chuẩn được sử dụng: 1để kiểm tra xem 2có bằng một trong các nguyên mẫu trong chuỗi nguyên mẫu của 5 hay không. |
Nói cách khác, so sánh cái này với cái khác: | Trong ví dụ trên 4, do đó đưa ra câu trả lời ngay lập tức. | Hầu hết các lớp không có 3. Trong trường hợp đó, logic chuẩn được sử dụng: 1để kiểm tra xem 2có bằng một trong các nguyên mẫu trong chuỗi nguyên mẫu của 5 hay không. |
Nói cách khác, so sánh cái này với cái khác: | Trong ví dụ trên 4, do đó đưa ra câu trả lời ngay lập tức. | Trong trường hợp thừa kế, sẽ ở bước thứ hai: |
Dưới đây là minh họa về những gì
let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
5so sánh với let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
6:Nhân tiện, cũng có một phương thức objA.isPrototypeOf[objB], trả về
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
4nếu let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
8có ở đâu đó trong chuỗi các nguyên mẫu của let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
9. Vì vậy, bài kiểm tra
// instead of class
function Rabbit[] {}
alert[ new Rabbit[] instanceof Rabbit ]; // true
4có thể được như /*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact:
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/
// setup instanceOf check that assumes that
// anything with canEat property is an animal
class Animal {
static [Symbol.hasInstance][obj] {
if [obj.canEat] return true;
}
}
let obj = { canEat: true };
alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
1.Thật buồn cười, nhưng bản thân constructor của
class Rabbit {}
let rabbit = new Rabbit[];
// is it an object of Rabbit class?
alert[ rabbit instanceof Rabbit ]; // true
6 không tham gia kiểm tra! Chỉ có chuỗi các nguyên mẫu và let arr = [1, 2, 3];
alert[ arr instanceof Array ]; // true
alert[ arr instanceof Object ]; // true
2.Điều đó có thể dẫn đến hậu quả thú vị khi một thuộc tính
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact:
Fanpage: //www.facebook.com/cafedevn
Instagram: //instagram.com/cafedevn
Twitter: //twitter.com/CafedeVn
Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
*/
// setup instanceOf check that assumes that
// anything with canEat property is an animal
class Animal {
static [Symbol.hasInstance][obj] {
if [obj.canEat] return true;
}
}
let obj = { canEat: true };
alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
4 được thay đổi sau khi đối tượng được tạo.- Giống như ở đây:
- Chúng ta đã biết rằng các đối tượng đơn giản được chuyển đổi thành chuỗi dưới dạng
5:/* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam @author cafedevn Contact: Fanpage: //www.facebook.com/cafedevn Instagram: //instagram.com/cafedevn Twitter: //twitter.com/CafedeVn Linkedin: //www.linkedin.com/in/cafe-dev-407054199/ */ // setup instanceOf check that assumes that // anything with canEat property is an animal class Animal { static [Symbol.hasInstance][obj] { if [obj.canEat] return true; } } let obj = { canEat: true }; alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
- Đó là việc họ thực hiện
6. Nhưng có một tính năng ẩn/* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam @author cafedevn Contact: Fanpage: //www.facebook.com/cafedevn Instagram: //instagram.com/cafedevn Twitter: //twitter.com/CafedeVn Linkedin: //www.linkedin.com/in/cafe-dev-407054199/ */ // setup instanceOf check that assumes that // anything with canEat property is an animal class Animal { static [Symbol.hasInstance][obj] { if [obj.canEat] return true; } } let obj = { canEat: true }; alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
6thực sự mạnh hơn thế nhiều. Chúng ta có thể sử dụng nó như một phần mở rộng/* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam @author cafedevn Contact: Fanpage: //www.facebook.com/cafedevn Instagram: //instagram.com/cafedevn Twitter: //twitter.com/CafedeVn Linkedin: //www.linkedin.com/in/cafe-dev-407054199/ */ // setup instanceOf check that assumes that // anything with canEat property is an animal class Animal { static [Symbol.hasInstance][obj] { if [obj.canEat] return true; } } let obj = { canEat: true }; alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
8và thay thế cho/* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam @author cafedevn Contact: Fanpage: //www.facebook.com/cafedevn Instagram: //instagram.com/cafedevn Twitter: //twitter.com/CafedeVn Linkedin: //www.linkedin.com/in/cafe-dev-407054199/ */ // setup instanceOf check that assumes that // anything with canEat property is an animal class Animal { static [Symbol.hasInstance][obj] { if [obj.canEat] return true; } } let obj = { canEat: true }; alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
3.class Rabbit {} let rabbit = new Rabbit[]; // is it an object of Rabbit class? alert[ rabbit instanceof Rabbit ]; // true
- Nghe khá lạ? Thật. Hãy làm sáng tỏ.
- Theo đặc tả, tích hợp
6có thể được trích xuất từ đối tượng và được thực thi trong ngữ cảnh của bất kỳ giá trị nào khác. Và kết quả của nó phụ thuộc vào giá trị đó./* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam @author cafedevn Contact: Fanpage: //www.facebook.com/cafedevn Instagram: //instagram.com/cafedevn Twitter: //twitter.com/CafedeVn Linkedin: //www.linkedin.com/in/cafe-dev-407054199/ */ // setup instanceOf check that assumes that // anything with canEat property is an animal class Animal { static [Symbol.hasInstance][obj] { if [obj.canEat] return true; } } let obj = { canEat: true }; alert[obj instanceof Animal]; // true: Animal[Symbol.hasInstance][obj] is called
- Đối với một số, nó sẽ là
1obj.__proto__ === Class.prototype? obj.__proto__.__proto__ === Class.prototype? obj.__proto__.__proto__.__proto__ === Class.prototype? ... // if any answer is true, return true // otherwise, if we reached the end of the chain, return false
- Đối với một boolean, nó sẽ là
2obj.__proto__ === Class.prototype? obj.__proto__.__proto__ === Class.prototype? obj.__proto__.__proto__.__proto__ === Class.prototype? ... // if any answer is true, return true // otherwise, if we reached the end of the chain, return false
- Dành cho
3: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 reached the end of the chain, return false
4obj.__proto__ === Class.prototype? obj.__proto__.__proto__ === Class.prototype? obj.__proto__.__proto__.__proto__ === Class.prototype? ... // if any answer is true, return true // otherwise, if we reached the end of the chain, return false
Dành cho
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 reached the end of the chain, return false
5: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 reached the end of the chain, return false
6Đối với mảng: 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 reached the end of the chain, return false
7
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 reached the end of the chain, return false