Chức năng gọi trong javascript chức năng tĩnh

giới tính tĩnh = "Nam";

Show

người dùng in tĩnh (nam){ // phương thức tĩnh

bảng điều khiển. log(`Tên - ${nam. tên } \nTuổi - ${nam. tuổi} \nGiới tính - ${Nam. giới tính}`);

let user = new Male("Ram", 20);

bảng điều khiển. log("Truy cap nam. thuộc tính tĩnh giới tính");

bảng điều khiển. log(Nam. giới tính);

bảng điều khiển. log("Gọi phương thức tĩnh Nam. printUser");

bảng điều khiển. nhật ký (người dùng. giới tính);

bảng điều khiển. nhật ký (người dùng. printUser);

Phương thức tĩnh trong JavaScript là phương thức có từ khóa tĩnh được thêm vào trước chính nó. Các phương thức như vậy không thể được truy cập thông qua các đối tượng được khởi tạo nhưng có thể được truy cập thông qua tên lớp. Điều này là do các phương thức tĩnh thuộc về lớp trực tiếp. Kế thừa thậm chí áp dụng cho các phương pháp tĩnh. Ngoài ra, các phương thức này có thể được gọi bằng các phương thức không tĩnh và thậm chí cả các hàm tạo. Các phương thức tĩnh được sử dụng để tạo các hàm tiện ích và tạo các đối tượng chứa thông tin mặc định

Phạm vi

  • Bài viết này nói về phương thức tĩnh trong JavaScript một cách chi tiết đồng thời chạm vào các thuộc tính tĩnh
  • Bài viết này sử dụng các ví dụ trong khi giải thích khái niệm về phương thức tĩnh
  • Bài viết này thậm chí còn nêu bật sự khác biệt giữa phương thức tĩnh và phương thức không tĩnh
  • Bài viết này thảo luận về ý tưởng tại sao chúng ta cần các phương thức tĩnh

Sự thôi thúc sử dụng phương thức tĩnh trong JavaScript

Trước khi bắt đầu sử dụng thực tế phương thức tĩnh, chúng ta cần biết động cơ khiến chúng ta sử dụng phương thức tĩnh. Hãy xem xét rằng chúng ta có một lớp tên là Square và một phương thức có tên là findPerimeter, được định nghĩa là

class Square {
    constructor(side) {
        this.side = side;
    }
    findPerimeter() {
        return 4 * this.side;
    }

}

Bây giờ, hãy tạo hai đối tượng kiểu Square, hình vuông 1 và hình vuông 2

let square1 = new Square(3);
let square2 = new Square(7);

Nếu chúng ta muốn tìm chu vi của đối tượng Square đầu tiên, thì chúng ta có thể tìm thấy nó bằng cách thực hiện square1. findPerimeter(). Nó sẽ cho chúng ta câu trả lời cần thiết

Cần lưu ý rằng, trong định nghĩa của phương thức findPerimeter, từ khóa this được sử dụng. Từ khóa this trong phương thức đề cập đến đối tượng mà qua đó phương thức sẽ được gọi. Do đó, sẽ công bằng khi nói rằng khi phương thức được gọi, phương thức sẽ được liên kết với đối tượng mà qua đó việc gọi đang diễn ra

Bây giờ, đôi khi chúng ta gặp tình huống muốn gọi một phương thức, nhưng chúng ta không muốn phương thức đó bị ràng buộc với một đối tượng

Nhân tiện, loại tình huống đó sẽ bao giờ phát sinh?

câu trả lời là Có

Giả sử chúng ta muốn so sánh chu vi của hai hình vuông mà chúng ta đã tạo ở trên, hình vuông1 và hình vuông2. Tuy nhiên, trước khi chúng ta bắt đầu tạo phương thức có tên là so sánhPerimeter, chúng ta nên tự hỏi liệu phương thức này, khi được gọi, có nên được liên kết với một đối tượng hay không. Câu trả lời rõ ràng là Không bởi vì một lý do là không thể liên kết phương thức với hai đối tượng cùng một lúc

Sau đó, phương thức sẽ bị ràng buộc với thực thể nào?

Câu trả lời là lớp

Bây giờ đến vai trò của phương thức tĩnh. Các phương thức tĩnh là những phương thức được liên kết với lớp. Chúng ta cũng có thể nói rằng các phương thức tĩnh trực tiếp thuộc về lớp

Phương thức tĩnh trong JavaScript là gì?

Một phương thức tĩnh là một phương thức được định nghĩa trong một lớp bằng cách sử dụng từ khóa tĩnh. Phương thức như vậy hóa ra hơi khác so với phương thức JavaScript thông thường. Sự khác biệt của phương thức tĩnh là nó không thể được truy cập bởi bất kỳ đối tượng khởi tạo nào của lớp. Thay vào đó, phương thức tĩnh chỉ có thể được truy cập bằng tên lớp vì nó trực tiếp thuộc về lớp

Trước khi biết cách gọi một phương thức tĩnh, điều cần thiết là phải biết cú pháp của nó

Cú pháp cho phương thức tĩnh trong JavaScript

Để định nghĩa một phương thức tĩnh trong JavaScript, chúng ta cần đặt tiền tố từ khóa tĩnh trước định nghĩa của phương thức

Giả sử, chúng ta có một phương thức JavaScript sendMessage được định nghĩa bên trong một lớp Trò chuyện

class Chat {
    sendMessage() {
        return "You got me!";
    }
}

Và bây giờ chúng tôi muốn chuyển đổi phương thức sendMessage ở trên thành một phương thức tĩnh. Sau đó, chúng tôi viết lại lớp như sau

class Chat {
    static sendMessage() {
      return "You got me!"; 
    }
}

Truy cập phương thức tĩnh trong JavaScript

Đầu tiên, chúng ta sẽ thấy cách truy cập phương thức tĩnh sai và sau đó là cách đúng. Biết sai trước sẽ biết cách tiếp cận không hiệu quả

Cách sai để truy cập phương thức tĩnh trong JavaScript

Giả sử chúng ta tạo một đối tượng ngoài lớp Trò chuyện như

Và bây giờ, chúng tôi muốn sử dụng đối tượng khởi tạo này để gọi phương thức tĩnh sendMessage. Sau đó, nếu chúng ta làm

console.log(myChat.sendMessage());

Chúng tôi sẽ gặp lỗi khi nói myChat. sendMessage không phải là một chức năng. Điều này cho thấy rằng không thể truy cập phương thức tĩnh thông qua các đối tượng

Đúng cách để truy cập phương thức tĩnh trong JavaScript

Mặt khác, nếu chúng ta truy cập trực tiếp phương thức tĩnh sendMessage bằng cách sử dụng tên lớp Chat, thì

console.log(Chat.sendMessage());

Cung cấp cho chúng tôi chuỗi trả về "You got me. ". Điều này cho thấy phương thức tĩnh có thể được truy cập bằng cách sử dụng trực tiếp tên lớp

Mối quan hệ giữa phương thức tĩnh và lớp

Để hiểu mối quan hệ thực tế giữa phương thức tĩnh và lớp, chúng ta sẽ tiếp tục với ví dụ về lớp Square và phương thức tĩnh so sánhPerimeter, mà chúng ta đã thấy ở đầu bài viết này. Lần này chúng ta sẽ triển khai phương thức tĩnh bên trong lớp

class Square {
    constructor(side) {
        this.side = side;
    }
    findPerimeter() {
        return 4 * this.side;
    }
    
    static comparePerimeter(square1, square2) {
        if (square1.side > square2.side) {
            console.log("First square has more perimeter");
        } else if (square1.side < square2.side) {
            console.log("Second square has more perimeter");
        } else {
            console.log("Both have same perimeter");
        }

    }

}

let square1 = new Square(3);
let square2 = new Square(7);
Square.comparePerimeter(square1, square2);

đầu ra

Second square has more perimeter

Bây giờ, nếu chúng ta muốn so sánh chu vi của hai đối tượng loại Square, thì biểu thức Square. so sánh Perimeter(square 1, square 2) cho ta kết quả là "Hình vuông thứ hai có chu vi lớn hơn". Vì vậy, chúng tôi thấy rằng chúng tôi có thể truy cập thành công phương thức tĩnh thông qua tên lớp. Điều này là do phương thức tĩnh trực tiếp thuộc về lớp

Mối quan hệ giữa phương thức tĩnh và đối tượng

Không có mối quan hệ trực tiếp nào tồn tại giữa phương thức tĩnh và đối tượng. Các đối tượng không được phép truy cập một phương thức tĩnh. Về mặt kỹ thuật, điều này xảy ra bởi vì bất cứ khi nào một phương thức tĩnh được định nghĩa trong một lớp, thì phương thức tĩnh đó về cơ bản được lưu trữ bên trong hàm tạo của lớp. Một phương thức tĩnh không được lưu trữ bên trong nguyên mẫu của lớp và do đó không thể truy cập được đối với các đối tượng. Trong JavaScript, các đối tượng chỉ có thể truy cập những thành viên của một lớp được lưu trữ bên trong nguyên mẫu của lớp. Hình ảnh dưới đây nói lên ý tưởng

Chức năng gọi trong javascript chức năng tĩnh

Phương thức tĩnh và cái này

Về cơ bản, một phương thức tĩnh thuộc về một lớp. Do đó, khi chúng ta sử dụng từ khóa this bên trong phần thân của phương thức tĩnh, thì từ khóa this sẽ đề cập đến chính lớp đó. Ý tưởng trở nên rõ ràng trong ví dụ sau

________số 8_______

Trong ví dụ trên, chúng ta có một phương thức tĩnh checkThis được định nghĩa bên trong một lớp Chat

Bây giờ, nếu chúng ta làm

console.log(Chat.checkThis());

Ta nhận được câu trả lời là đúng. Điều này chứng tỏ rằng từ khóa này bên trong một phương thức tĩnh đề cập đến lớp đã định nghĩa nó

Truy cập các thành viên tĩnh từ một phương thức tĩnh khác

Có, thậm chí có thể truy cập các thành viên tĩnh từ một phương thức tĩnh khác. Việc truy cập như vậy đạt được bằng cách sử dụng từ khóa this. Giả sử, chúng ta có một lớp Người dùng và ba thành viên tĩnh được định nghĩa trong lớp

let square1 = new Square(3);
let square2 = new Square(7);
0

đầu ra

let square1 = new Square(3);
let square2 = new Square(7);
1

Bây giờ, nếu chúng ta dùng thử Người dùng. loginHelloEmail(), chúng tôi nhận được đầu ra ở trên. Vì vậy, chúng ta thấy rằng phương thức tĩnh loginHelloEmail có thể truy cập thuộc tính tĩnh helloEmail và phương thức tĩnh checkValidEmail thông qua từ khóa này

Truy cập các thành viên tĩnh từ một hàm tạo lớp và các phương thức không tĩnh

Đầu tiên, chúng ta sẽ xem cách truy cập các thành viên tĩnh từ một hàm tạo của lớp, sau đó, thứ hai, chúng ta sẽ xem cách truy cập chúng từ các phương thức không tĩnh

Truy cập các thành viên tĩnh từ một Trình xây dựng lớp

Chà, một hàm tạo của lớp có thể truy cập một thành viên tĩnh. Truy cập như vậy có thể đạt được thông qua tên lớp. Ví dụ dưới đây mô tả ý tưởng

let square1 = new Square(3);
let square2 = new Square(7);
2

Như chúng ta có thể thấy ở trên, hàm tạo đang truy cập thuộc tính tĩnh helloEmail và phương thức tĩnh welcomeMessage thông qua tên lớp Người dùng. Bây giờ, để thực thi hàm tạo, chúng ta cần tạo một đối tượng. Vì vậy, khi chúng tôi làm

đầu ra

let square1 = new Square(3);
let square2 = new Square(7);
3

Chúng tôi được hiển thị hello@company. com và Chào mừng đến với đội ngũ của chúng tôi. như đầu ra

Truy cập các thành viên tĩnh từ các phương thức không tĩnh

Các phương thức không tĩnh có thể truy cập các thành viên tĩnh thông qua tên lớp giống như cách chúng ta đã thấy trong trường hợp hàm tạo trong phần phụ trước. Ví dụ dưới đây mô tả ý tưởng

let square1 = new Square(3);
let square2 = new Square(7);
4

Vì vậy, trong đoạn mã trên, chúng ta thấy rằng phương thức không tĩnh welcome đang truy cập thuộc tính tĩnh helloEmail và phương thức tĩnh welcomeMessage thông qua tên lớp Người dùng. Vì vậy, nếu chúng ta làm

let square1 = new Square(3);
let square2 = new Square(7);
5

đầu ra

let square1 = new Square(3);
let square2 = new Square(7);
3

Như hình trên, nó sẽ cho chúng ta hello@company. com và Chào mừng đến với đội ngũ của chúng tôi. như đầu ra

Vì phương thức tĩnh thuộc về một lớp và không thể truy cập thông qua các đối tượng, điều này có nghĩa là bộ nhớ cho phương thức tĩnh chỉ được cấp phát một lần và không phụ thuộc vào số lượng đối tượng khởi tạo được tạo. Điều này cũng ngụ ý rằng phương thức tĩnh không được chia sẻ giữa các đối tượng được khởi tạo bởi vì một phương thức như vậy không thể được gọi thông qua bất kỳ đối tượng được khởi tạo nào

Tại sao chúng ta cần phương thức tĩnh trong JavaScript

Như đã thảo luận ở đầu bài viết này, ý tưởng có một phương thức tĩnh trong JavaScript xuất hiện khi chúng ta muốn liên kết phương thức đó với một lớp hơn là với bất kỳ đối tượng được khởi tạo nào. Có thể có hai trường hợp sử dụng (nhưng không giới hạn) khi chúng tôi muốn có một phương thức tĩnh

Để tạo các chức năng tiện ích

Hãy xem một ví dụ để hiểu cách một phương thức tĩnh có thể được sử dụng như một hàm tiện ích. Giả sử chúng ta có một lớp Người dùng được định nghĩa là

let square1 = new Square(3);
let square2 = new Square(7);
7

Và chúng tôi đã khởi tạo nhiều đối tượng của lớp Người dùng. Bây giờ, nếu chúng ta muốn có một phương thức để xóa một đối tượng đã khởi tạo nào đó, thì việc khai báo phương thức đó là một phương thức tĩnh sẽ là một quyết định đúng đắn.

let square1 = new Square(3);
let square2 = new Square(7);
8

Vì vậy, giả sử chúng ta cần xóa một đối tượng có tên user1, sau đó User. xóa (user1) sẽ làm điều cần thiết

Bây giờ, chúng ta có thể lập luận rằng tác vụ xóa tương tự có thể được thực hiện bằng phương pháp không tĩnh

Tuy nhiên, ở đây chúng ta cần hiểu rằng việc xóa một đối tượng nên được thực hiện bằng một phương thức liên quan nhiều hơn đến lớp có kiểu đối tượng đó. Điều này làm cho mọi thứ có ý nghĩa hơn. Giống như khi chúng tôi muốn tạo bất kỳ biến nào trong JavaScript, chúng tôi cố gắng đặt cho nó một cái tên mô tả cuối cùng chức năng của biến đó. Tương tự, khi chúng ta thấy rằng một phương thức mà chúng ta sẽ định nghĩa sẽ có mối quan hệ với lớp hơn là một đối tượng được khởi tạo, chúng ta khai báo phương thức đó là tĩnh

Để tạo các đối tượng chứa thông tin mặc định

Hãy xem xét phương thức tĩnh sau đây createDefault bên trong một lớp Người dùng

let square1 = new Square(3);
let square2 = new Square(7);
9

Vì vậy, bất cứ khi nào chúng ta muốn tạo một đối tượng với thông tin mặc định, chúng ta không cần phải tự tạo đối tượng đó. Thay vào đó, chúng ta chỉ cần gọi phương thức tĩnh createDefault và chúng ta sẽ nhận được một đối tượng mới với thông tin đó

Một phương pháp như vậy rất hữu ích khi chúng ta muốn tạo loại đối tượng đó, nhưng chúng ta không biết thông tin mặc định mà đối tượng sẽ chứa là gì. Do đó, nếu chúng ta làm console. nhật ký (Người dùng. createDefault()), nó sẽ cho chúng ta thấy

class Chat {
    sendMessage() {
        return "You got me!";
    }
}
0

Ở đây, trong trường hợp sử dụng này, một lần nữa, chúng ta thấy rằng việc gọi phương thức bằng tên lớp đang tạo ra một số ý nghĩa. Ý nghĩa là khi chúng ta viết biểu thức User. createDefault(), chúng ta hiểu rằng phương thức này sẽ tạo ra thứ gì đó thuộc kiểu lớp Người dùng

Sự khác biệt giữa Phương thức tĩnh và Phương thức không tĩnh trong JavaScript

Phương thức tĩnh Phương thức không tĩnh1. Trực thuộc lớp1. Thuộc lớp gián tiếp2. Không thể được gọi thông qua các đối tượng khởi tạo2. Có thể được gọi thông qua các đối tượng khởi tạo3. Từ khóa this, khi được sử dụng bên trong phương thức, đề cập đến lớp 3. Từ khóa this khi được sử dụng bên trong phương thức, đề cập đến đối tượng mà phương thức được gọi thông qua đó

Những điểm cần nhớ về phương thức tĩnh trong JavaScript

1. Một phương thức có thể được tạo thành tĩnh bằng cách chỉ cần thêm từ khóa tĩnh vào nó

2. Phương thức tĩnh là một phương thức của một lớp nhưng không phải của đối tượng được khởi tạo

3. Phương thức tĩnh không thể được truy cập bởi các đối tượng khởi tạo

4. Phương thức tĩnh có thể được truy cập bằng tên lớp

5. Về mặt kỹ thuật, phương thức tĩnh được lưu trữ bên trong hàm tạo của lớp chứ không phải nguyên mẫu của lớp

6. Các phương thức tĩnh hoàn toàn không được chia sẻ với các đối tượng được khởi tạo

7. Bất cứ khi nào một phương thức tĩnh được định nghĩa, bộ nhớ của nó chỉ được cấp phát một lần và bộ nhớ không phụ thuộc vào số lượng đối tượng được khởi tạo

8. Các phương thức tĩnh thường được sử dụng để tạo một đối tượng chứa thông tin mặc định hoặc để tạo các hàm tiện ích

9. Kế thừa cũng hoạt động cho các phương thức tĩnh

Thuộc tính tĩnh

Trong JavaScript, ngoài việc có các phương thức tĩnh trong một lớp, chúng ta cũng có thể có các thuộc tính tĩnh trong một lớp. Các thuộc tính tĩnh khác với các thuộc tính thông thường giống như cách các phương thức tĩnh khác với các phương thức thông thường mà chúng ta đã thấy trong các phần trước

Cú pháp cho thuộc tính tĩnh trong JavaScript

Giả sử, chúng ta có một lớp Trò chuyện và một thông báo thuộc tính

class Chat {
    sendMessage() {
        return "You got me!";
    }
}
1

Tuy nhiên, chúng tôi muốn có thông báo thuộc tính đó dưới dạng thông báo tĩnh. Vì vậy, chúng tôi viết lại lớp như sau

class Chat {
    sendMessage() {
        return "You got me!";
    }
}
2

Truy cập thuộc tính tĩnh trong JavaScript

Thuộc tính tĩnh trong JavaScript có thể được truy cập thông qua tên lớp. Chẳng hạn, trong ví dụ trên, nếu chúng tôi muốn truy cập thông báo thuộc tính tĩnh, thì chúng tôi sẽ truy cập nó dưới dạng Trò chuyện. tin nhắn. Do đó, nếu chúng ta làm console. nhật ký (Trò chuyện. tin nhắn), nó sẽ cho chúng ta thấy "Chúc một ngày tốt lành. " là đầu ra

Kế thừa các phương thức và thuộc tính tĩnh

Ngay cả các phương thức và thuộc tính tĩnh cũng có thể được kế thừa. Giả sử chúng ta có một lớp cha là Người dùng và một lớp con là Khách hàng

class Chat {
    sendMessage() {
        return "You got me!";
    }
}
3

đầu ra

class Chat {
    sendMessage() {
        return "You got me!";
    }
}
4

Trong đoạn mã trên, lớp cha Người dùng có hai thành viên tĩnh. Một là điểm thuộc tính tĩnh và một điểm khác là phương thức tĩnh sayHi. Ta thấy lớp Customer được khai báo là lớp con của lớp User. Vì vậy, nếu chúng ta dùng thử bảng điều khiển. nhật ký (Khách hàng. điểm) và bảng điều khiển. nhật ký (Khách hàng. sayHi), chúng tôi sẽ được hiển thị lần lượt là 20 và Xin chào, bạn thấy tôi cũng được thừa kế. Điều này có nghĩa là lớp Khách hàng đang kế thừa thuộc tính tĩnh và phương thức của lớp Người dùng

Làm cách nào để gọi hàm tĩnh bên trong lớp trong JavaScript?

Để gọi một phương thức hoặc thuộc tính tĩnh trong một phương thức tĩnh khác của cùng một lớp, bạn có thể sử dụng từ khóa this .

Hàm tĩnh có thể gọi hàm cá thể không?

Một phương thức tĩnh không thể truy cập các biến thể hiện và các phương thức thể hiện của một lớp , bởi vì một phương thức tĩnh có thể được gọi ngay cả khi không có đối tượng nào của lớp được khởi tạo. Vì lý do tương tự, tham chiếu this không thể được sử dụng trong phương thức tĩnh.

Cách gọi không

Giải pháp 1. Một phương thức tĩnh KHÔNG cung cấp tham chiếu đến một thể hiện của lớp của nó (nó là một phương thức lớp), do đó, không, bạn không thể gọi một phương thức không tĩnh bên trong một phương thức tĩnh. Tạo một đối tượng của lớp bên trong phương thức tĩnh và sau đó gọi phương thức không tĩnh bằng cách sử dụng một đối tượng như vậy .

Các phương thức tĩnh có thể gọi được trên các phiên bản của một lớp không?

Các lệnh gọi phương thức tĩnh được thực hiện trực tiếp trên lớp và không thể gọi được trên các phiên bản của lớp . Các phương thức tĩnh thường được sử dụng để tạo các hàm tiện ích.