Saya telah menghabiskan beberapa jam terakhir mencoba menemukan solusi untuk masalah saya tetapi tampaknya tidak ada harapan.
Pada dasarnya saya perlu tahu cara memanggil metode induk dari kelas anak. Semua hal yang saya coba sejauh ini berakhir dengan tidak berfungsi atau menulis metode induk secara berlebihan.
Saya menggunakan kode berikut untuk mengatur OOP dalam javascript:
// SET UP OOP
// surrogate constructor (empty function)
function surrogateCtor() {}
function extend(base, sub) {
// copy the prototype from the base to setup inheritance
surrogateCtor.prototype = base.prototype;
sub.prototype = new surrogateCtor();
sub.prototype.constructor = sub;
}
// parent class
function ParentObject(name) {
this.name = name;
}
// parent's methods
ParentObject.prototype = {
myMethod: function(arg) {
this.name = arg;
}
}
// child
function ChildObject(name) {
// call the parent's constructor
ParentObject.call(this, name);
this.myMethod = function(arg) {
// HOW DO I CALL THE PARENT METHOD HERE?
// do stuff
}
}
// setup the prototype chain
extend(ParentObject, ChildObject);
Saya perlu memanggil metode induk terlebih dahulu dan kemudian menambahkan beberapa hal lagi di kelas anak.
Dalam sebagian besar bahasa OOP yang akan sesederhana memanggil parent.myMethod()
Tapi saya benar-benar tidak dapat memahami bagaimana hal itu dilakukan dalam javascript.
Bantuan apa pun sangat kami hargai, terima kasih!
sumber
ParentClass.prototype.myMethod.apply() or
ParentClass.prototype.myMethod.call () `, seperti yang Anda lakukan dengan konstruktor Anda.ParentClass.prototype.myMethod.call(this, arg1, arg2, arg3...);
)myMethod
di kelas Anda.Gaya ES6 memungkinkan Anda untuk menggunakan fitur baru, seperti
super
kata kunci.super
kata kunci itu semua tentang konteks kelas induk, ketika Anda menggunakan sintaksis kelas ES6. Sebagai contoh yang sangat sederhana, checkout:Anda juga dapat menggunakan
super
untuk memanggil induk konstruktor:Dan tentu saja Anda dapat menggunakannya untuk mengakses properti kelas induk
super.prop
. Jadi, gunakan ES6 dan berbahagialah.sumber
super
disebut? Apakah ada kesetaraan dalam JS "lama"?super()
metode statis; Sepertinya Anda menggunakannya di konstruktor.Nah untuk melakukan ini, Anda tidak dibatasi dengan
Class
abstraksi ES6. Mengakses metode prototipe induk konstruktor dimungkinkan melalui__proto__
properti (saya cukup yakin akan ada sesama coders JS untuk mengeluh bahwa itu didepresiasi) yang disusutkan tetapi pada saat yang sama menemukan bahwa itu sebenarnya merupakan alat penting untuk kebutuhan sub-classing ( terutama untuk kebutuhan sub-class Array). Jadi sementara__proto__
properti masih tersedia di semua mesin JS utama yang saya tahu, ES6 memperkenalkanObject.getPrototypeOf()
fungsi di atasnya. Thesuper()
alat dalamClass
abstraksi adalah gula sintaksis ini.Jadi jika Anda tidak memiliki akses ke nama induk konstruktor dan tidak ingin menggunakan
Class
abstraksi Anda masih dapat melakukan sebagai berikut;sumber
Dalam hal tingkat pewarisan berganda, fungsi ini dapat digunakan sebagai metode super () dalam bahasa lain. Ini demo biola , dengan beberapa tes, Anda bisa menggunakannya seperti ini, di dalam metode Anda:
call_base(this, 'method_name', arguments);
Itu menggunakan fungsi ES yang sangat baru, kompatibilitas dengan browser yang lebih lama tidak menjamin. Diuji dalam IE11, FF29, CH35.
sumber
Bagaimana dengan sesuatu berdasarkan ide Douglas Crockford:
sumber
Berikut cara yang bagus untuk objek anak untuk memiliki akses ke properti dan metode induk menggunakan rantai prototipe JavaScript, dan itu kompatibel dengan Internet Explorer. JavaScript mencari rantai prototipe untuk metode dan kami ingin rantai prototipe anak terlihat seperti ini:
Contoh anak -> Prototipe anak (dengan metode Anak) -> Prototipe orang tua (dengan metode Induk) -> Prototipe objek -> null
Metode anak juga dapat memanggil metode induk shadowed, seperti yang ditunjukkan pada tiga tanda bintang di bawah.
Begini caranya:
sumber
Ada solusi yang jauh lebih mudah dan lebih kompak untuk pencarian prototipe bertingkat, tetapi membutuhkan
Proxy
dukungan. Penggunaan:SUPER(<instance>).<method>(<args>)
, misalnya, dengan asumsi dua kelasA
danB extends A
dengan metodem
:SUPER(new B).m()
.sumber
Meskipun Anda dapat memanggil metode orangtua dengan prototipe dari orang tua, Anda akan harus lulus contoh anak saat ini untuk menggunakan
call
,apply
ataubind
metode. Itubind
Metode akan membuat fungsi baru jadi saya tidak menyarankan bahwa jika Anda peduli untuk kinerja kecuali hanya dipanggil sekali.Sebagai alternatif, Anda dapat mengganti metode anak dan meletakkan metode induk pada instance saat memanggil metode anak asli.
sumber