ES6 - Gọi phương thức tĩnh trong một lớp


82

Tôi có lớp này thực hiện một cuộc gọi nội bộ đến một phương thức tĩnh:

export class GeneralHelper extends BaseHelper{
     static is(env){
          return config.get('env:name') === env;
     }

     static isProd(){
         return GeneralHelper.is('prod');
     }
 }

Có bất kỳ từ khóa nào tôi có thể sử dụng để thay thế tên lớp trong dòng bên dưới không:

GeneralHelper.is('prod');

Trong PHP có self, staticv.v. ES6 có cung cấp bất kỳ điều gì tương tự như những thứ này không?

TY.


Tôi đã đăng một câu trả lời phức tạp hơn trong một chủ đề riêng về vấn đề này: stackoverflow.com/a/43694337/3182819
Thomas Urban

Câu trả lời:


74

nếu bạn đang gọi hàm tĩnh từ bên trong một thể hiện, thì cách thích hợp để tham chiếu đến hàm tĩnh của lớp là:

this.constructor.functionName();

es6 gọi các phương thức tĩnh


11
OP không hỏi về việc gọi nó từ một phiên bản. (Nếu anh ta là, nó sẽ là một bản sao của câu hỏi mà bạn liên kết)
Bergi

Đó thậm chí không phải là một câu trả lời. this.constructor.is('prod')sẽ đưa ra lỗi trong trường hợp này.
UtkarshPramodGupta

Đây là giải pháp khi bạn muốn gọi phương thức tĩnh của mình khi bạn đang ở bên trong một lớp khởi tạo, Nếu không, bạn chỉ cần gọi this.method(). Ngoài ra khi bạn mở rộng một lớp học mà bạn gọisuper.method()

54

Nó giống như việc gọi một phương thức trên một đối tượng bình thường . Nếu bạn gọi GeneralHelper.isProd()phương thức, GeneralHelpersẽ có sẵn như thistrong phương thức, vì vậy bạn có thể sử dụng

class GeneralHelper {
     static is(env) { … }
     static isProd(){
         return this.is('prod');
     }
}

Tuy nhiên, điều này sẽ không hoạt động khi phương thức được chuyển xung quanh như một hàm gọi lại, giống như bình thường . Ngoài ra, nó có thể khác với việc truy cập GeneralHelperrõ ràng khi ai đó kế thừa isProdtừ lớp của bạn và ghi đè is, InheritedHelper.isProd()sẽ tạo ra các kết quả khác.

Nếu bạn đang tìm cách gọi các phương thức tĩnh từ các phương thức phiên bản, hãy xem tại đây . Cũng lưu ý rằng một lớp chỉ định nghĩa các phương thức tĩnh là một điều kỳ quặc, bạn có thể muốn sử dụng một đối tượng thuần túy để thay thế.


17
Tôi nghĩ đó là khá khó hiểu sử dụng "này" từ khóa trong một bối cảnh tĩnh, nhưng dù sao nó làm việc tốt, nhờ
Shlomi

6
Có, trong PHP $, điều này đề cập đến đối tượng hiện tại mà bạn đang ở trong phương thức của nó, trong các phương thức của lớp '(tĩnh), bạn không có từ khóa này tồn tại (bạn có' self 'và mới nhất là' static '). Theo như tôi nhớ, cũng trong Java, từ khóa "this" không có sẵn trong một phương thức tĩnh - và nó có ý nghĩa: không có thực thể "this" khi bạn ở trong một ngữ cảnh tĩnh .. "this" phải nói về tổ chức nói riêng và vào phương pháp tĩnh bạn đang đề cập cho cả lớp hoặc cho các hoạt động chung ..
Shlomi

11
Là một nhà phát triển JS, điều rất quan trọng là phải hiểu cách thishoạt động. Nó không hoạt động giống như thiscác ngôn ngữ khác.
loganfsmyth

1
@kidwon: Một lời gọi hàm tạo khá giống một lời gọi phương thức, vì vậy nó giống như ở đó (với điểm khác biệt duy nhất là thiskhông thể sử dụng được trước lệnh gọi siêu).
Bergi

1
@kidwonconstructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani

33

Cả hai câu trả lời ở đây đều đúng và tốt, nhưng tôi muốn bổ sung thêm chi tiết dựa trên tiêu đề câu hỏi này.

Khi tôi thấy "ES6 - Gọi phương thức tĩnh trong một lớp", nó giống như "gọi một phương thức tĩnh (từ một phương thức không tĩnh) trong một lớp". Không xác định những gì người hỏi câu hỏi ban đầu đang hỏi trong chi tiết.

Nhưng đối với bất kỳ ai muốn biết cách gọi một phương thức tĩnh từ một phương thức không tĩnh trong một lớp, bạn có thể thực hiện như sau:

class MyClass {
    myNonStaticMethod () {
        console.log("I'm not static.")
        MyClass.myStaticMethod()
    }

    static myStaticMethod () {
        console.log("hey, I'm static!")
    }
}

MyClass.myStaticMethod() // will log "hey, I'm static!"

const me = new MyClass()

me.myNonStaticMethod() // will log "I'm not static" and then "hey, I'm static!"

Ý tưởng là phương thức tĩnh có thể được gọi mà không cần tạo một thể hiện mới của lớp. Điều đó có nghĩa là bạn có thể gọi nó bên trong phương thức của instance giống như cách bạn gọi nó bên ngoài instance.

Một lần nữa, tôi biết đó không phải là chi tiết của câu hỏi yêu cầu, nhưng điều này có thể hữu ích cho những người khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.