Apa cara standar untuk memanggil metode statis? Saya bisa memikirkan menggunakan constructor
atau menggunakan nama kelas itu sendiri, saya tidak suka yang terakhir karena merasa tidak perlu. Apakah yang pertama direkomendasikan, atau ada yang lain?
Berikut ini contoh (buat-buat):
class SomeObject {
constructor(n){
this.n = n;
}
static print(n){
console.log(n);
}
printN(){
this.constructor.print(this.n);
}
}
javascript
class
static
ecmascript-6
es6-class
simonzack
sumber
sumber
SomeObject.print
terasa alami. Tetapithis.n
di dalam tidak masuk akal karena tidak ada contoh, jika kita berbicara tentang metode statis.printN
tidak statis.Jawaban:
Kedua cara itu layak, tetapi mereka melakukan hal-hal yang berbeda ketika menyangkut pewarisan dengan metode statis yang ditimpa. Pilih orang yang perilakunya Anda harapkan:
Mengacu pada properti statis melalui kelas akan benar-benar statis dan terus-menerus memberikan nilai yang sama. Menggunakan
this.constructor
sebaliknya akan menggunakan pengiriman dinamis dan merujuk ke kelas instance saat ini, di mana properti statis mungkin memiliki nilai yang diwarisi tetapi juga bisa diganti.Ini cocok dengan perilaku Python, di mana Anda dapat memilih untuk merujuk ke properti statis baik melalui nama kelas atau instance
self
.Jika Anda mengharapkan properti statis tidak akan ditimpa (dan selalu merujuk ke salah satu dari kelas saat ini), seperti di Jawa , gunakan referensi eksplisit.
sumber
class
sintaks), tidak ada perbedaan dalam definisi metode. Ini hanya masalah bagaimana Anda melihatnya, melalui properti yang diwarisiconstructor
atau langsung dengan namanya.Property 'staticProperty' does not exist on type 'Function'
Saya menemukan thread ini mencari jawaban untuk kasus yang sama. Pada dasarnya semua jawaban ditemukan, tetapi masih sulit untuk mengekstrak esensi dari mereka.
Jenis Akses
Asumsikan kelas Foo mungkin berasal dari beberapa kelas lain dengan esensi lebih banyak dari kelas itu.
Kemudian mengakses
this.method()
this.property
Foo.method()
Foo.property
this.constructor.method()
this.constructor.property
this.method()
this.property
Foo.method()
Foo.property
Foo.prototype.method.call( this )
Object.getOwnPropertyDescriptor( Foo.prototype,"property" ).get.call(this);
Latar Belakang
this
mengacu pada contoh saat ini.super
pada dasarnya mengacu pada contoh yang sama, tetapi sedikit menangani metode dan getter yang ditulis dalam konteks beberapa kelas saat ini sedang diperluas (dengan menggunakan prototipe prototipe Foo).this.constructor
.this
tersedia untuk merujuk langsung ke definisi kelas saat ini.super
juga tidak merujuk pada beberapa instance, tetapi pada metode statis dan getter yang ditulis dalam konteks beberapa kelas saat ini sedang diperluas.Kesimpulan
Coba kode ini:
sumber
Own non-overridden instance method/getter / not possible by intention unless using some workaround
--- Sayang sekali. Menurut pendapat saya, ini adalah kekurangan ES6 +. Mungkin itu harus diperbarui untuk memungkinkan hanya merujuk kemethod
- yaitumethod.call(this)
. Lebih baik dariFoo.prototype.method
. Babel / dll. dapat diimplementasikan menggunakan NFE (bernama ekspresi fungsi).method.call( this )
adalah solusi yang mungkin kecuali untukmethod
tidak terikat ke "kelas" pangkalan yang diinginkan kemudian dan dengan demikian gagal menjadi metode instance / pengambil non-override . Selalu mungkin untuk bekerja dengan metode independen kelas seperti itu. Meskipun demikian saya tidak berpikir desain saat ini seburuk itu. Dalam konteks objek kelas yang berasal dari kelas dasar Anda Foo mungkin ada alasan bagus untuk mengganti metode instance. Metode yang ditimpa mungkin memiliki alasan yang baik untuk memintasuper
penerapannya atau tidak. Salah satu kasus memenuhi syarat dan harus dipatuhi. Kalau tidak, itu akan berakhir dengan desain OOP yang buruk.arguments.callee
atau NFE.this
). Kedengarannya seperti mencoba mencampur manfaat pointer arithmetics dari bare C dengan level C # yang lebih tinggi. Karena penasaran: untuk apa Anda menggunakanarguments.callee
kode OOP yang dirancang dengan rapi?this.inherited(currentFn, arguments);
- di manacurrentFn
ada referensi ke fungsi yang sedang dijalankan. Tidak dapat merujuk fungsi yang sedang dieksekusi secara langsung membuatnya sedikit berbulu di TypeScript, yang mengambil sintaks kelasnya dari ES6.Jika Anda berencana melakukan warisan apa pun, maka saya akan merekomendasikan
this.constructor
. Contoh sederhana ini harus menggambarkan mengapa:test1.callPrint()
akan masukConstructorSuper Hello ConstructorSuper!
ke konsoltest2.callPrint()
akan masukConstructorSub Hello ConstructorSub!
ke konsolKelas bernama tidak akan berurusan dengan warisan dengan baik kecuali jika Anda secara eksplisit mendefinisikan kembali setiap fungsi yang membuat referensi ke Kelas bernama. Berikut ini sebuah contoh:
test3.callPrint()
akan masukNamedSuper Hello NamedSuper!
ke konsoltest4.callPrint()
akan masukNamedSuper Hello NamedSub!
ke konsolLihat semua yang di atas berjalan di Babel REPL .
Anda dapat melihat dari ini yang
test4
masih berpikir itu di kelas super; dalam contoh ini mungkin tidak tampak seperti masalah besar, tetapi jika Anda mencoba untuk mereferensikan fungsi anggota yang telah ditimpa atau variabel anggota baru, Anda akan menemukan diri Anda dalam masalah.sumber