Meskipun JavaScript adalah bahasa yang berorientasi objek, mekanisme warisannya berbeda dari bahasa berorientasi objek tradisional lainnya sejak awal. Ini adalah mekanisme warisan berbasis prototipe. Namun, di bawah mekanisme ini, masih ada beberapa metode implementasi yang berbeda untuk warisan.
Metode 1: Warisan Klasik
Yang disebut warisan kelas mengacu pada meniru metode warisan bahasa yang berorientasi objek tradisional. Baik warisan dan pihak yang diwariskan adalah "kelas". Kodenya adalah sebagai berikut:
Pertama -tama tentukan kelas induk (atau superclass):
function person (name) {this.name = name; } Person.prototype.getName = function () {return this.name; };Atribut orang kelas induk didefinisikan dalam konstruktor, yang dapat memastikan bahwa atribut nama subclass mewarisi itu tidak berbagi atribut ini dengannya, tetapi milik subclass secara terpisah. Metode getName dipasang pada prototipe untuk memungkinkan beberapa contoh subkelas yang mewarisi untuk berbagi badan metode ini, sehingga memori dapat disimpan (untuk beberapa contoh, setiap kali contoh baru keluar, ia akan memastikan bahwa metode GetName dari instance ini mengacu pada ruang memori yang sama, daripada ruang independen).
Definisikan metode warisan, sebagai berikut:
function extand (subclass, superclass) {var f = function () {}; F.prototype = superclass.prototype; subclass.prototype = new f (); subclass.prototype.constructor = subclass; subclass.Superclass = superclass.prototype; if (superclass.prototype.constructor == object.prototype.constructor) {superclass.prototype.constructor = superclass; }}Dalam metode ini, pertama -tama buat kelas F baru, biarkan prototipe menjadi prototipe kelas induk, dan biarkan prototipe titik subkelas ke instance dari kelas F, sehingga mencapai tujuan mewarisi kelas induk. Pada saat yang sama, karena prototipe subkelas dimodifikasi, atribut konstruktor dari prototipe yang dimodifikasi diarahkan ke subkelas, sehingga memiliki fungsi konstruktor, dan pada saat yang sama, subkelas dapat memasang atribut superclass. Subkelas dapat memanggil kelas induk melalui properti ini, sehingga membangun hubungan antara subkelas dan kelas induk.
Tentukan penulis subkelas untuk mewarisi orang kelas induk, sebagai berikut:
Function Author (Name, Books) {Author.SuperClass.constructor.call (ini, nama); this.book = buku; } extension (penulis, orang); With.prototype.getBooks = function () {return this.book; }Di sini, konstruktor kelas induk disebut melalui atribut superclass di konstruktor subclass. Pada saat yang sama, metode panggilan digunakan untuk mengonversi pointer ini dari panggilan metode, sehingga penulis subkelas juga memiliki (mewarisi) sifat -sifat kelas induk, dan subkelas juga memiliki buku atributnya sendiri. Oleh karena itu, buku parameter ditugaskan ke buku atribut dalam konstruktor untuk mencapai tujuan konstruksi. Gunakan fungsi perpanjangan untuk mewarisi sifat dan metode pada prototipe orang tua kelas (sebenarnya, hanya metode yang diwarisi, karena kami hanya memasang metode ke prototipe sebelumnya, dan sifat -sifat tersebut didefinisikan dalam konstruktor). Pada saat yang sama, penulis memiliki metodenya sendiri GetBooks, memasangnya pada prototipe yang sesuai, mencapai tujuan memperluas lebih lanjut berdasarkan warisan.
Metode warisan ini jelas merupakan jenis warisan yang mirip dengan bahasa tradisional yang berorientasi objek. Keuntungannya adalah mudah bagi programmer yang terbiasa dengan konsep berorientasi objek tradisional. Kerugiannya adalah bahwa prosesnya relatif rumit dan konsumsi memori sedikit lebih besar, karena subclass juga memiliki konstruktor dan prototipe sendiri, dan atribut subkelas dan kelas induk sepenuhnya terisolasi. Bahkan jika keduanya memiliki nilai yang sama, mereka tidak dapat berbagi memori yang sama.
Metode 2: Prototipe Warisan
Pertama, tentukan kelas orang tua. Di sini kita tidak akan sengaja meniru penggunaan konstruktor untuk mendefinisikannya, tetapi secara langsung mendefinisikan objek dalam bentuk literal objek, yang merupakan kelas induk
var person = {name: 'name default', getName: function () {return this.name; }};Seperti metode pertama, objek memiliki nama properti dan metode getName.
Kemudian tentukan metode kloning untuk mengimplementasikan warisan subkelas ke kelas induk, sebagai berikut:
function clone (obj) {function f () {} f.prototype = obj; mengembalikan f baru (); }Metode kloning membuat objek baru, menunjuk prototipe objek ke kelas induk, yaitu parameter OBJ, dan mengembalikan objek pada saat yang sama.
Akhirnya, subclass mewarisi kelas induk melalui fungsi kloning, sebagai berikut:
var penulis = klon (orang); Author.Book = ['JavaScript']; Woriten.showbook = function () {return this.book; }Di sini subkelas didefinisikan, dan orang tua kelas orang tua diwarisi melalui fungsi klon, dan buku atribut diperluas, dan buku showbook metode diperluas. Di sini, subclass juga memiliki nama atribut, tetapi sama dengan nilai nama kelas induk, sehingga tidak diganti. Jika berbeda, Anda dapat menggunakannya.
Author.name = 'nama baru'; Timpa properti ini untuk mendapatkan nilai atribut nama baru dari subkelas.
Warisan prototipe ini lebih sederhana dan lebih alami daripada warisan kelas. Pada saat yang sama, jika atribut dari subkelas dan nilai atribut kelas induk adalah sama dan dapat dimodifikasi, maka mereka benar -benar berbagi ruang memori yang sama. Misalnya, atribut nama di atas sulit dipahami bagi pemrogram yang terbiasa dengan program berorientasi objek tradisional. Jika keduanya dipilih, metode ini tidak diragukan lagi lebih baik.
Karena JavaScript mengadopsi pendekatan berbasis prototipe untuk mengimplementasikan pewarisan, dan prototipe masing-masing objek hanya dapat menunjuk ke instance dari kelas tertentu (tidak ke beberapa instance), bagaimana menerapkan beberapa pewarisan (yaitu, biarkan kelas memiliki metode dan atribut dari beberapa kelas pada waktu yang sama, dan tidak mendefinisikan metode dan atribut mereka sendiri secara internal)?
Dalam pola desain JavaScript, kelas mixin diberikan:
Pertama, tentukan kelas doping untuk menyimpan beberapa metode dan atribut yang umum digunakan. Metode dan atribut ini dapat ditambahkan ke kelas lain melalui ekspansi, sehingga kelas yang ditambahkan memiliki metode dan atribut tertentu dari kelas. Jika beberapa kelas doping didefinisikan dan ditambahkan ke kelas secara bersamaan, maka kelas secara tidak langsung mengimplementasikan "warisan berganda". Berdasarkan ide ini, implementasinya adalah sebagai berikut:
Definisi Kelas Dominan Elemen:
var mixin = function () {}; Mixin.prototype = {serialize: function () {var output = []; untuk (tombol dalam ini) {output.push (key+":"+ini [key]); } return output.join (','); }}Kelas doping memiliki metode serial yang digunakan untuk melintasi dirinya sendiri, mengeluarkan atributnya sendiri dan nilai atribut, dan mengembalikannya sebagai string, dipisahkan oleh koma.
Tentukan metode ekspansi untuk membuat kelas memiliki atribut atau metode kelas multi-kelompok setelah ekspansi, sebagai berikut:
fungsi augment (receiveclass, givingClass) {if (argumen [2]) {for (var i = 2, len = argumen.length; i <len; i ++) {receivingclass.prototype [argumen [i]] = givingclass.prototype [argumen [i]]; }} else {for (MethodName di GivingClass.Prototype) {if (! ReciVeClass.Prototype [MethodName]) {receivingClass.prototype [MethodName] = GivingClass.prototype [MethodName]; }}}}Metode ini memiliki dua parameter secara default. Parameter pertama menerima kelas yang diperluas, parameter kedua adalah kelas doped (digunakan untuk memperluas kelas lain), dan mungkin ada parameter lain. Jika lebih besar dari dua parameter, parameter selanjutnya adalah metode metode atau atribut, yang digunakan untuk menunjukkan bahwa kelas yang diperluas ingin mewarisi atribut yang ditentukan atau metode kelas yang didoping. Kalau tidak, semua atribut dan metode kelas doped diwarisi secara default. Dalam fungsi ini, cabang IF pertama digunakan untuk mewarisi atribut dan metode yang ditentukan, dan cabang lain adalah kasus di mana semua atribut dan metode diwarisi secara default. Inti dari metode ini adalah untuk memperluas (menambahkan) properti dan metode pada prototipe kelas doping elemen ke prototipe kelas yang diperluas, sehingga memiliki sifat dan metode kelas doping elemen.
Akhirnya, gunakan metode ekspansi untuk mencapai banyak warisan
augment (penulis, mixin); var penulis = penulis baru ('js', ['pola desain javascript']); waspada (penulis.serialize ());Ini adalah kelas penulis. Kelas ini mewarisi dari kelas induk seseorang dan juga memiliki metode dan sifat dari mixin kelas yang dimetabolisme. Jika Anda mau, Anda dapat mendefinisikan N yang dimetabolisme kelas untuk memperluas kelas. Ini juga dapat mewarisi sifat dan metode dari kelas teretabolisme lain yang Anda definisikan, sehingga warisan berganda direalisasikan. Akhirnya, hasil operasi dari metode serial penulis adalah sebagai berikut:
Anda akan menemukan bahwa kelas ini memiliki properti dan metode kelas orang, kelas penulis, dan kelas mixin. Properti dan metode orang dan mixin semuanya diperoleh melalui "warisan". Bahkan, ia menyadari banyak warisan.