Một điều thú vị khác về ES6 là bạn có thể mở rộng các cài đặt sẵn. Ý tôi không phải là làm trò khỉ với nguyên mẫu của thứ gì đó như mảng hoặc số, nhưng ý tôi là chúng ta có thể tạo các lớp của riêng mình được mô hình hóa sau một mảng. Giả sử chúng ta muốn tạo một bộ sưu tập phim trông giống như thế này
const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];
Bây giờ bộ sưu tập phim sẽ lấy
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];0, đó là tên bộ sưu tập của chúng ta, và sau đó đối số hai, ba, bốn, v.v., sẽ có một bộ phim, trong đó bạn có
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];1 của bộ phim và số . Đây giống như một mảng, ngoại trừ nó sẽ có thuộc tính là
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];0, và sau đó chúng ta cũng sẽ thêm các phương thức vào mảng này
Những gì chúng tôi làm là chúng tôi tạo một lớp
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];4 mở rộng mảng dựng sẵn
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];
Chúng ta cần một hàm tạo ở đây, nhưng những đối số nào sẽ được truyền vào khi chúng ta tạo một bộ sưu tập phim mới? . Nhưng sau đó, làm cách nào để nắm bắt các mục hai, ba, bốn, v.v. cho phần còn lại của các đối số mà bạn cần?
tôi chỉ nói nó. Chúng ta có thể sử dụng phần còn lại, trong trường hợp này là
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];6
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];
Điều đó sẽ làm là điều đầu tiên đối số đầu tiên là một
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];1 và phần còn lại của chúng được thông qua sẽ là
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];8. Vì vậy, hãy thử một cái gì đó
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];2
Nếu chúng tôi cố chạy cái này, chúng tôi sẽ gặp một lỗi khá quen thuộc, cho chúng tôi biết rằng ________ 19. Tại sao chúng ta không thể đặt
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];0 trên bộ sưu tập phim?
Hãy nhớ rằng, bất cứ khi nào bạn mở rộng thứ gì đó, bạn cần tạo thứ mà bạn đang mở rộng trước, trước khi tạo thứ bạn muốn
làm sao chúng ta làm việc đó bây giờ?
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];5
Những gì chúng tôi đã làm được gọi là
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];1 và đã thông qua nó
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];8. Chúng tôi đã làm điều đó bởi vì nó giống như tạo một mảng mới sẽ lấy mục một, hai, ba, v.v., giống như
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];3. Bởi vì chúng tôi không biết chúng tôi sẽ có bao nhiêu mặt hàng, chúng tôi có thể vượt qua nó
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];8 để nắm bắt mọi thứ
Nếu chúng tôi chạy mã này, chúng tôi sẽ thấy
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];5 của chúng tôi trong bảng điều khiển, nhưng
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];5 của chúng tôi sẽ là một mảng của một mảng
Đó không phải là chính xác những gì chúng ta muốn. Chúng tôi muốn có thể đặt từng mục vào một mảng, không phải một mảng trong một mảng, vì vậy chúng tôi sử dụng trải rộng, trong trường hợp này là
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];6 vào hàm
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];3
Chúng tôi làm điều này vì
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];8 là một mảng, nhưng chúng tôi muốn chuyển
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];9 mỗi mục làm đối số. Điều này thật tuyệt vì chúng ta đã chụp tất cả chúng bằng một phần còn lại, sau đó chúng ta quay lại và trải chúng vào hàm
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];9 của chúng ta, đó là mảng
Nếu gọi
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];5 trong bảng điều khiển của chúng tôi, nó sẽ trả về các đối tượng này, nếu chúng tôi mở chúng ra, bạn sẽ thấy tất cả các bộ phim khác nhau có trong mảng của chúng tôi
Nếu chúng tôi yêu cầu
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];22 trong bảng điều khiển, chúng tôi sẽ thấy nó có tên là "Phim yêu thích của Wes"
Chúng ta có thể có một mảng nhưng chúng ta cũng có thể có các thuộc tính. Đó là bởi vì, vào cuối ngày, mảng vẫn là đối tượng trong JavaScript
Bây giờ những gì chúng ta có thể làm là thêm các phương thức vào bộ sưu tập phim này. Hãy thêm phim bằng cách sử dụng
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];23
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];0
Mặc dù chúng ta có lớp
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];4, nhưng vì chúng ta đã mở rộng Array nên nó kế thừa tất cả các phương thức của mảng
Vì vậy, chúng tôi có thể thêm một bộ phim mới bằng cách thêm
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];25 thêm Titanic là một bộ phim năm sao. Nếu chúng tôi chạy mã này trong bảng điều khiển của mình, chúng tôi sẽ thấy Titanic ở đó, bộ phim cuối cùng của chúng tôi là Titanic
Điều tiếp theo tôi muốn chỉ cho bạn là sử dụng vòng lặp
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];26
Trong bảng điều khiển, chúng ta có thể chạy
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];4
Những gì chúng ta sẽ thấy là chúng ta nhận được ________ 127, ________ 128, ________ 129, ________ 150 và
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];51. Điều đó hợp lý vì nó là chỉ mục của từng đối tượng trong lớp của chúng ta, nhưng sau đó chúng ta nhận được
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];1
Tại sao chúng ta có được tên?
Tuy nhiên, chúng ta cũng đã học về
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];56, nó chỉ lặp lại các thuộc tính có thể lặp lại của một đối tượng. chúng ta có thể sử dụng
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];5
Nếu chúng tôi chạy nó, bạn sẽ thấy rằng chúng tôi không nhận được
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];1 và chúng tôi cũng nhận được
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];58 thực tế cho mỗi bộ phim, không chỉ là chỉ mục như chúng tôi đã làm trước đây. Đó là một điều thực sự thú vị khi bạn vẫn có thể thêm các thuộc tính vào một mảng, nhưng chúng ta có thể bỏ qua các thuộc tính đó bằng vòng lặp
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];56
Hãy thêm một phương pháp nữa vào đây, nơi tôi muốn có thể sắp xếp mảng phim này và sau đó lấy 2, 3 hoặc 10 phim hàng đầu hoặc bao nhiêu chúng tôi muốn
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];9
Vì vậy, chúng tôi đã gọi phương thức của mình là
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];30, phương thức này đang lấy
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];31 làm đối số của nó. Nếu bạn có hàng nghìn phim chuyển động, bạn chỉ muốn lấy lại một số ít, nhưng ở đây chúng tôi đã đặt đối số chức năng mặc định của mình thành 10, điều này sẽ mang lại 10 phim hàng đầu của chúng tôi
Ở dòng tiếp theo, chúng ta có thể thực hiện sắp xếp nhanh và bẩn, và
class MovieCollection extends Array { constructor[name, ...items] { } } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];0 trong trường hợp này là ________ 14, là một mảng, mà chúng ta có thể sử dụng ________ 234, đây là một phương thức có sẵn cho mảng. Cùng với đó, chúng ta có thể sắp xếp từng đối tượng trong mảng của mình và xem nếu
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];35 lớn hơn
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];36 thì chúng ta sẽ có -1 và 1. Sau đó, chúng ta có thể gọi
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];37 trên đó và cắt từ chỉ số 0 đến giới hạn, theo mặc định là 10
Bây giờ chúng tôi có thể gọi
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];38 và nó sẽ mang các bộ phim của chúng tôi trở lại, nhưng chúng sẽ chỉ hiển thị dưới dạng
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];39
Điều đó không tốt lắm, nhưng thay vào đó, hãy thử sử dụng
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];00
Nếu bạn chạy nó trong bảng điều khiển của mình, nó sẽ cung cấp cho chúng tôi tất cả các bộ phim, được sắp xếp theo số lượng sao, trong một bảng đẹp. Bạn cũng có thể vượt qua
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];01, hai bộ phim được xếp hạng cao nhất và điều đó sẽ mang lại cho tôi một bảng gồm hai bộ phim được xếp hạng cao nhất
Điều đó thực sự tiện dụng nếu bạn có thể có một mảng, nhưng cũng có các phương thức ở phía trước nó. Mở rộng mảng, bạn có thể mở rộng bất kỳ nội dung gốc nào được tích hợp vào JavaScript để tạo bộ sưu tập của riêng bạn
Cuối cùng, chúng ta cần thêm một lời cảnh báo khi mở rộng mảng với các lớp cho một bộ sưu tập tùy chỉnh. Chúng tôi đang sửa đổi chữ ký hàm tạo của mảng mở rộng, vì vậy chúng tôi không thể trả lời khi quay lại các phương thức mảng 'gốc' như
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];02,
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];03 trên thể hiện lớp của mảng mà chúng tôi đang sử dụng. Tương tự, chúng ta không thể dựa vào hành vi của bất kỳ phương thức nào khác trả về một thể hiện mới của một mảng nếu trước tiên chúng ta chưa xác định hành vi của nó trong ngữ cảnh của lớp mở rộng. Lý do cho hành vi 'bất ngờ' là Javascript gọi hàm tạo mỗi khi nó chạy
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];02 và hàm tạo đó được gọi với độ dài của mảng ban đầu. Vì chúng tôi đã sửa đổi chữ ký của hàm tạo, bản sao mới của mảng sẽ không giống như bạn mong đợi. Để sử dụng các phương thức 'gốc' này, bạn sẽ phải định nghĩa rõ ràng chúng trong lớp mở rộng, như chúng ta đã làm với phương thức
class MovieCollection extends Array { } const movies = new MovieCollection['Wes\'s Fav Movies', {name: 'Bee Movie', stars: 10}, {name: 'Star Wars Trek', stars: 1}, {name: 'Virgin Suicides', stars: 7}, {name: 'King of the Road', stars: 8} ];05