Hướng dẫn javascript override method - phương pháp ghi đè javascript
Không trừ khi bạn thực hiện tất cả các biến "công khai", tức là làm cho họ thành viên của 0 trực tiếp hoặc thông qua thuộc tính 1. Show
Bạn sẽ nhận thấy một vài thay đổi. Quan trọng nhất là cuộc gọi đến hàm tạo "siêu lớp" được cho là hiện đang ẩn trong dòng này:
Cả 2 và 3 giờ đây sẽ có các thành viên có thể sửa đổi riêng lẻ 4 và 5, điều này sẽ không xảy ra nếu chúng tôi đã viết 6 thay thế.Sau đó, 4, 5 và 9 đều là thành viên "công khai" để gán một 0 khác cho họ
Sẽ "ghi đè" bản gốc 0 bằng tên đó.Cuối cùng, cuộc gọi đến 9 không thể được thực hiện trong Tuyên bố 0 vì cuộc gọi ngầm đến "Super-Class" sau đó sẽ được thực thi lại khi chúng tôi đặt "Super-Class" cho thuộc tính 1 của "lớp được cho là" ".Nhưng tốt, đây là ít nhiều bạn sẽ làm điều này như thế nào trong JavaScript. HTH, FK Tính kế thừa của lớp là một cách để một lớp mở rộng từ một lớp khác. Vì vậy, chúng ta có thể tạo phương thức mới trên các đối tượng hiện có.
1. Từ khóa “extends”Từ khóa “extends”2. Ghi đè(Overriding) một phương thức
3. Overriding constructor 4. Super: nội bộ(internals), [[HomeObject]] Chúng ta có lớp 5:Đây là cách chúng ta có thể biểu diễn đối tượng 6 và Sơ đồ của lớp 5:Và tôi muốn tạo ra một cái khác 8.
Vì thỏ là động vật, lớp 9nên dựa vào 5, có quyền truy cập vào các phương thức của động vật, để thỏ có thể làm những gì mà động vật có tên chung chung có thể làm.Trong nội bộ, từ khóa 9 hoạt động bằng cách sử dụng các cơ chế của nguyên mẫu(prototype). Nó đặt 0thành 1. Vì vậy, nếu không tìm thấy một phương thức 2, JavaScript sẽ lấy nó từ đó 1.Chẳng hạn, để tìm phương thức 4, động cơ sẽ kiểm tra (từ dưới lên trên hình):động cơ sẽ kiểm tra (từ dưới lên trên hình):
Như chúng ta có thể nhớ lại từ chương Native prototypes, JavaScript tự sử dụng tính kế thừa nguyên mẫu cho các đối tượng. Ví dụ như 3là 4. Đó là lý do tại sao ngày có quyền truy cập vào các phương thức đối tượng chung.Bất kỳ biểu thức nào cũng được cho phép 5Cú pháp class cho phép chỉ định không chỉ một lớp, mà bất kỳ biểu thức nào cũng đi sau từ khoá 9.Ví dụ, một lệnh gọi hàm tạo lớp cha:
Ở đây 7kế thừa từ kết quả của 8.Điều đó có thể hữu ích cho các mẫu lập trình nâng cao khi chúng ta sử dụng các hàm để tạo các lớp tùy thuộc vào nhiều điều kiện và có thể kế thừa từ chúng. 2. Ghi đè(Overriding) một phương thứcGhi đè(Overriding) một phương thứcBây giờ chúng ta hãy tiến lên và ghi đè(Overriding) một phương thức. Theo mặc định, tất cả các phương thức không được chỉ định trong 8đều được thực hiện trực tiếp như là từ 0.Nhưng nếu chúng ta chỉ định phương thức riêng của mình trong 9, chẳng hạn như 2nó sẽ được sử dụng thay thế:
Thông thường chúng ta không muốn thay thế hoàn toàn một phương thức cha, mà là xây dựng lại phương thức cha để điều chỉnh hoặc mở rộng hàm của nó. Chúng ta làm một cái gì đó trong phương thức của chúng ta, nhưng gọi phương thức cha trước / sau nó hoặc trong quy trình. Các lớp cung cấp từ khóa 3 để làm điều đó.
Ví dụ, hãy để thỏ của chúng ta tự động khi dừng lại:
Bây giờ 9có phương thức 7 và nó gọi phương thức cha 8trong quá trình. Hàm mũi tên không có 9Các hàm mũi tên không có 0.Nếu được truy cập, nó được lấy từ hàm bên ngoài. Ví dụ:
Hàm 0trong mũi tên giống như trong 2, vì vậy nó hoạt động như dự định. Nếu chúng ta đã chỉ định một hàm thông thường của người dùng ở đây, thì sẽ xảy ra lỗi:
3. Overriding constructorOverriding constructorVới các constructor, nó có một chút khó khăn.constructor, nó có một chút khó khăn. Cho đến bây giờ, 9không có 4riêng của nó .Theo đặc tả , nếu một lớp mở rộng một lớp khác và không có 4, thì lớp trống rỗng sau đây được tạo ra một 4: 0Như chúng ta có thể thấy, về cơ bản nó gọi 4cha truyền cho nó tất cả các đối số. Điều đó xảy ra nếu chúng ta không viết một 4 của riêng lớp con.Bây giờ hãy thêm một hàm tạo tùy chỉnh của mình vào 9. Nó sẽ tạo thêm 0ngoài thuộc tính 1: 1Rất tiếc! Chúng ta đã có một lỗi. Bây giờ chúng ta không thể tạo ra thỏ. Có chuyện gì? Câu trả lời ngắn gọn là: các hàm xây dựng(constructors) trong kế thừa các lớp phải gọi 5và phải Làm điều đó trước khi sử dụng 3.…Nhưng tại sao? Những gì đang xảy ra ở đây? Thật vậy, yêu cầu có vẻ lạ. Tất nhiên, có một lời giải thích. Hãy đi vào chi tiết, vì vậy bạn sẽ thực sự hiểu những gì đang diễn ra. Trong JavaScript, có một sự khác biệt giữa hàm xây dựng(constructors) của một lớp kế thừa (cái gọi là hàm tạo của lớp dẫn xuất hay hàm tạo của lớp con) và các hàm khác. Một constructor dẫn xuất có một thuộc tính nội bộ đặc biệt 4. Đó là một nhãn nội bộ đặc biệt.Nhãn đó ảnh hưởng đến hành vi của nó với 5.
Vì vậy, một hàm tạo có nguồn gốc phải gọi 0để thực thi hàm tạo (không dẫn xuất) của nó, nếu không thì đối tượng 3sẽ không được tạo. Và chúng ta sẽ nhận được một lỗi.Để hàm tạo 9 hoạt động, nó cần gọi 01trước khi sử dụng 3, như ở đây: 24. Super: nội bộ(internals), [[HomeObject]]Super: nội bộ(internals), [[HomeObject]]Thông tin nâng cao Nếu bạn đang học bài hướng dẫn này lần đầu tiên – phần này có thể bị bỏ qua. Đó là về các cơ chế nội bộ đằng sau sự kế thừa và 0.Chúng ta hãy đi sâu hơn một chút` của 0. Chúng ta sẽ thấy một số điều thú vị trên đường đi.Đầu tiên phải nói, từ tất cả những gì chúng ta đã học cho đến bây giờ, nó không thể làm cho 0 làm việc được!Vâng, thực sự, chúng ta hãy tự hỏi, làm thế nào nó nên hoạt động về mặt kỹ thuật? Khi một phương thức đối tượng chạy, nó nhận được đối tượng hiện tại là 3. Nếu chúng ta gọi 07thì Công cụ của Javascript cần lấy 08từ nguyên mẫu của đối tượng hiện tại. Nhưng bằng cách nào?Nhiệm vụ có vẻ đơn giản, nhưng không phải. Công cụ biết đối tượng 3 hiện tại , vì vậy nó có thể lấy 08cha là 11. Thật không may, một giải pháp này không hoạt động.Hãy chứng minh vấn đề. Không có các lớp, sử dụng các đối tượng đơn giản vì mục đích đơn giản. Bạn có thể bỏ qua phần này và đi đến phần phụ 12 nếu bạn không muốn biết chi tiết. Điều đó sẽ không gây hại. Hoặc đọc tiếp nếu bạn muốn tìm hiểu sâu về những điều sâu sắc.Trong ví dụ dưới đây , 13. Bây giờ hãy thử: 14chúng ta sẽ gọi 15, sử dụng 16: 3Tại dòng 17chúng ta lấy 18từ nguyên mẫu ( 6) và gọi nó trong ngữ cảnh của đối tượng hiện tại. Xin lưu ý rằng điều này rất quan trọng ở đây 20, bởi vì đơn giản 21sẽ thực thi 18 cha trong ngữ cảnh của nguyên mẫu, không phải đối tượng hiện tại.Và trong đoạn code trên nó thực sự hoạt động như dự định: chúng ta có chính xác 23.Bây giờ hãy thêm một đối tượng vào chuỗi. Chúng ta sẽ thấy mọi thứ vỡ như thế nào: 4Code không hoạt động nữa! Chúng ta có thể thấy lỗi khi cố gắng gọi 24.Nó có thể không rõ ràng, nhưng nếu chúng ta theo dõi lệnh gọi 24, thì chúng ta có thể thấy lý do tại sao. Trong cả hai dòng 17và 27giá trị của 3là đối tượng hiện tại ( 29). Điều đó rất cần thiết: tất cả các phương thức đối tượng đều lấy đối tượng hiện tại 3, không phải là nguyên mẫu hay thứ gì đó.Vì vậy, trong cả hai dòng 17và 27giá trị của 16là hoàn toàn giống nhau : 5. Cả hai gọi 35mà không đi lên chuỗi xử lý trong vòng lặp vô tận.Đây là bức tranh về những gì xảy ra:
52. Sau đó, trong dòng 17của 35, chúng ta muốn vượt qua lệnh gọi thậm chí cao hơn trong chuỗi xử lý, nhưng 39, vì vậy 43là một lần nữa 35! 63. Vì vậy, bản thân 35gọi nó trong vòng lặp vô tận, bởi vì nó không thể tăng thêm nữa. Vấn đề không thể được giải quyết bằng cách sử dụng 3một mình.
|