Warisan dalam JavaScript cukup aneh. Itu tidak dapat menerapkan warisan antarmuka dan hanya dapat mengandalkan pewarisan prototipe.
Rantai prototipe
Prototipe adalah objek. Contoh yang dibuat melalui konstruktor akan memiliki pointer ke prototipe untuk mendapatkan properti dan metode prototipe. Dengan cara ini, objek instan memiliki metode atribut konstruktor dan metode atribut dari prototipe, dan kemudian menunjukkan prototipe konstruktor yang perlu diwarisi dengan contoh ini, sehingga semua metode atribut dari instance dapat diwariskan.
Lihat kode demo berikut:
// Deklarasikan superclass, tambahkan properti dan metode yang relevan melalui konstruktor dan prototipe fungsi super () {this.property = true;} super.prototype.getSupervalue = fungsi () {return this.property;}; Superclass dan dapatkan semuanya di subtipe superclass.prototype = baru super (); subtype.prototype.constructor = subtipe; subtipe.prototype.getSubValue = function () {return this.subproperty;}; // Buat objek dari subclass ke dalam uji apakah untuk menguji ini untuk menguji win -motifs. console.log (instance.getSuperValue ());Prototipe default dari semua fungsi adalah instance objek, sehingga prototipe default akan berisi pointer internal ke objek.prototype.
Gunakan instanceof dan isPrototypeOf untuk menentukan hubungan antara prototipe dan instance:
instance dari objek; objek.prototype.isprototypeof (instance);
Saat menggunakan rantai prototipe, Anda perlu mendefinisikan metode dengan cermat. Subkelas perlu menulis ulang metode atau ekstensi supertype, dan harus ditempatkan setelah pernyataan yang menggantikan prototipe, sehingga dapat berlaku. Selain itu, saat mewarisi melalui rantai prototipe, Anda tidak dapat menggunakan literal objek untuk membuat metode prototipe, yang akan mengganti rantai prototipe:
...... subtipe.prototype = new super (); subtipe.prototype = {....};Ini menggantikan pointer untuk menunjuk ke objek baru, menulis ulang rantai prototipe.
Metode warisan rantai prototipe cacat, dan ada dua masalah utama:
1. Dari prototipe yang berisi nilai jenis referensi, itu akan dibagikan oleh semua contoh.
Seperti disebutkan dalam artikel sebelumnya, atribut prototipe yang berisi nilai jenis referensi akan dibagikan oleh semua contoh. Satu contoh akan dimodifikasi dan contoh lainnya akan berubah sesuai. Oleh karena itu, atribut perlu didefinisikan dalam konstruktor. Ketika rantai prototipe mewarisi, tidak peduli apakah atribut dalam superclass didefinisikan dalam konstruktor atau prototipe, semua menjadi objek instan dan diwarisi oleh subkelas, sehingga memiliki dampak pada contoh subkelas.
2. Saat membuat instance subtipe, parameter tidak dapat diteruskan ke konstruktor supertype.
Warisan rantai prototipe secara langsung menunjukkan prototipe subclass ke instance superclass, dan pada saat ini, parameter dapat diteruskan ke superclass. Namun, ketika subclass membuat instance, ia hanya dapat meneruskan parameter ke konstruktor subclass, tetapi tidak untuk konstruktor superclass.
Oleh karena itu, dalam aplikasi praktis, rantai prototipe jarang digunakan sendiri.
Beberapa praktik kode terkait
Identifikasi atribut prototipe
Fungsi HasPrototyPeProperty (objek, nama) {return name in object &&! Object.hasownproperty (name);}Menggunakan objek prototipe dalam konstruktor
function person (name) {this.name = name;} person.prototype = {constructor: person, sayname: function () {console.log (this.name); }, toString: function () {}}; var person1 = orang baru ('nicholas'); var person2 = orang baru ('greg); console.log (person1 instance dari orang); // trueconsole.log (person1.constructor === orang); // trueconsole.log (person1.constructor === orang); // trueconsole.log (person1.constructor === objek); // falseconsole.log (person2 instance dari orang); // trueconsole.log (person2.constructor === orang); // trueconsole.log (person2.constructor === objek); // PALSUWarisan objek
var person1 = {name: 'nicholas', sayname: function () {console.log (this.name); }}; var person2 = object.create (person1, {name: {configable: true, enumerable: true, value: 'greg', writable: true}}); person1.sayname (); // nicholasperson2.sayname (); // gregconsole.log (person1.hasownproperty ('sayname')); // trueconsole.log (person1.ispropertyof (person2)); // trueconsole.log (person2.hasownproperty ('sayname')); // PALSUMode modul
var person = (function () {var usia = 25; fungsi getage () {return usia;} function growolder () {Age ++;} return {name: 'nicholas', getage: getage, growolder: growolder};} ());Konstruktor Lingkup
function person (name) {this.name = name;} person.prototype.sayname = function () {console.log (this.name);}; var person1 = person ('nicholas'); console.log (person1 instance dari orang); // falseconsole.log (typeof person1); // undefinedconsole.log (nama); // Nicholas