Apakah mungkin untuk memanggil metode dasar dari metode prototipe dalam JavaScript jika sudah ditimpa?
MyClass = function(name){
this.name = name;
this.do = function() {
//do somthing
}
};
MyClass.prototype.do = function() {
if (this.name === 'something') {
//do something new
} else {
//CALL BASE METHOD
}
};
javascript
prototype
overriding
markvpc
sumber
sumber
Jawaban:
Saya tidak mengerti apa sebenarnya yang Anda coba lakukan, tetapi biasanya menerapkan perilaku objek spesifik dilakukan di sepanjang baris ini:
sumber
Nah salah satu cara untuk melakukannya adalah menyimpan metode dasar dan kemudian memanggilnya dari metode utama, seperti itu
sumber
_do_base
menyimpan referensi ke fungsi apa pun yang didefinisikan sebelumnya. Jika tidak ada, maka itu akan terjadiundefined
. JavaScript bukan —make
ekspresi tidak pernah dievaluasi dengan malas seperti yang Anda sarankan. Sekarang, jika prototipe yang diwarisi dari juga menggunakan _do_base untuk menyimpan apa yang menurutnya merupakan implementasi dari tipe dasarnyado
, maka Anda memiliki masalah. Jadi, ya, penutupan akan menjadi cara yang lebih baik, aman-warisan untuk menyimpan referensi ke implementasi fungsi asli jika menggunakan metode ini — meskipun itu akan membutuhkan penggunaanFunction.prototype.call(this)
.Saya khawatir teladan Anda tidak bekerja seperti yang Anda pikirkan. Bagian ini:
menimpa definisi
Karena objek yang baru dibuat sudah memiliki properti "do", itu tidak mencari rantai prototypal.
Bentuk klasik warisan dalam Javascript adalah awkard, dan sulit untuk dipahami. Saya sarankan menggunakan pola pewarisan sederhana Douglas Crockfords sebagai gantinya. Seperti ini:
Menurut pendapat saya cara yang jauh lebih jelas dalam menangani objek, konstruktor dan pewarisan dalam javascript. Anda dapat membaca lebih lanjut di Crockfords Javascript: Bagian yang baik .
sumber
base_do
sebagai fungsi, karena Anda kehilanganthis
ikatan dengando
metode asli seperti itu. Jadi, pengaturan metode dasar sedikit lebih kompleks, terutama jika Anda ingin menyebutnya menggunakan objek dasar sebagaithis
ganti objek anak. Saya akan menyarankan sesuatu yang miripbase_do.apply(me, arguments)
.var
untukbase_do
? Apakah ini disengaja dan, jika ya, mengapa? Dan, seperti yang dikatakan @GiulioPiancastelli, apakah pemutusan inithis
mengikat di dalambase_do()
atau akankah panggilan itu mewarisithis
dari pemanggilnya?var
harus ada. Menggunakancall
(atauapply
) memungkinkan kita untuk mengikatthis
dengan benar.Saya tahu posting ini berasal dari 4 tahun yang lalu, tetapi karena latar belakang C # saya, saya sedang mencari cara untuk memanggil kelas dasar tanpa harus menentukan nama kelas tetapi mendapatkannya dengan properti di subclass. Jadi saya hanya perubahan jawaban Christoph akan
Dari ini:
Untuk ini:
sumber
this.constructor
mungkin tidak selalu menunjuk ke sanaMyClass
.jika Anda mendefinisikan fungsi seperti ini (menggunakan OOP)
ada dua cara untuk memanggil fungsi prototipe: 1) membuat instance dan memanggil fungsi objek:
dan cara lainnya adalah ... 2) memanggil fungsi langsung dari prototipe:
sumber
Solusi ini menggunakan
Object.getPrototypeOf
TestA
adalah super yang dimilikigetName
TestB
adalah anak yang menimpagetName
tetapi, juga memilikigetBothNames
panggilansuper
versigetName
dan jugachild
versisumber
sumber
Sebuah alternatif :
sumber
__proto__
(yang mengubah [[Prototipe]] `suatu objek) harus dihindari. Silakan gunakanObject.create(...)
rute sebagai gantinya.Jika saya mengerti dengan benar, Anda ingin fungsionalitas Base selalu dilakukan, sementara sebagian harus dibiarkan implementasi.
Anda mungkin terbantu oleh pola desain ' metode templat '.
sumber
Jika Anda tahu kelas super Anda dengan namanya, Anda dapat melakukan sesuatu seperti ini:
Ini akan dicetak
seperti yang diharapkan.
sumber
Cara lain dengan ES5 adalah dengan secara eksplisit melintasi rantai prototipe menggunakan
Object.getPrototypeOf(this)
sumber
Tidak, Anda perlu memberi fungsi do di konstruktor dan fungsi do di prototipe nama yang berbeda.
sumber
Selain itu, jika Anda ingin mengganti semua instance dan bukan hanya satu instance khusus, yang ini mungkin membantu.
hasil:
sumber
sumber