Kaedah penulisan dalam pengaturcaraan lanjutan adalah seperti berikut
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.lessons = ['Math','Physics'];
}
Person.prototype = {
constructor: Person,
getName: function(){
return this.name;
}
}
Jadi jika saya menulisnya seperti ini, adakah ia sama sahaja?
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.lessons = ['Math','Physics'];
Person.prototype.getName = function(){
return this.name;
}
}
Apakah perbezaan antara menulis definisi prototaip (lokasi) di dalam atau di luar pembina?
Cara penulisan kedua akan melaksanakan operasi pada prototaip setiap kali kejadian dibuat! Intinya ialah operasi ini tidak bermakna, dan kaedah ini adalah sama untuk setiap kejadian.
Dalam kaedah pertama, apabila prototaip ditulis di luar pembina, masalah definisi berulang atau peruntukan memori boleh diselesaikan secara formal dan melalui peruntukan memori.
Sepadan dengan cara penulisan pertama dalam ingatan Tidak kira berapa banyak kejadian yang anda buat, setiap kejadian hanya menduduki nama, umur, pekerjaan dan pelajaran. Hanya terdapat satu salinan getName dalam ingatan, dikongsi oleh semua kejadian; cara kedua penulisan, Setiap contoh yang baru dibuat akan memperuntukkan ruang tambahan (tindanan) untuk melaksanakan definisi prototaip.
Apakah perbezaan antara cara prototaip diberikan nilai dalam kaedah pertama dan kaedah kedua?
Perbezaan adalah sangat besar Setelah kelas fungsi ditakrifkan, sifat pembina lalainya adalah dirinya sendiri, dan contohnya akan mengembalikan nilai ini apabila mengakses sifat pembina.
Mengapa anda perlu mentakrifkan pembina dalam kaedah 1 Kerana ia menetapkan semula prototaip Jika anda tidak mentakrifkan pembina (
Person.prototype = {getName: function() {}}
) , maka di atas Dalam contoh, nilai pulanganp.constructor
akan menjadiObject
, iaitu, pembina p ialah Object, yang jelas tidak konsisten dengan fakta .Person.prototype = {getName: function() {}}
),那么上例中p.constructor
返回值将是Object
, 即p的构造函数是Object,显然与事实不符。方法1更明智的做法是不要重新给prototype赋值,只为prototype添加我们需要的属性getName, 改为
Pendekatan yang lebih masuk akal dalam Kaedah 1 adalah bukan untuk menetapkan semula prototaip, tetapi hanya menambah atribut getName yang kita perlukan pada prototaip, dan menukarnya kepadaPerson.prototype.getName = function() {return this.name;}
Person.prototype.getName = function() {return this. name;} code>, iaitu kaedah takrifan dalam kaedah kedua, ditulis dengan cara ini supaya ia tidak akan mengatasi atribut lalai prototaip. #🎜🎜#
Cara penulisan dahulu menulis semula prototaip, dan cara penulisan anda hanya menambah kaedah pada prototaip. Kedua-duanya adalah cara yang berbeza
Mengikut cara anda menulisnya, ruang storan akan diperuntukkan semula kepada contoh semasa setiap proses instantiasi Salah satu maksud corak prototaip ialah semua kejadian boleh berkongsi atribut dan kaedah pada prototaip, walaupun berbuat demikian sahaja mempunyai kelemahan. . Perkara kedua ialah saya masih lebih suka menulis objek objek prototaip secara literal Saya secara peribadi berpendapat bahawa satu lebih intuitif, dan yang kedua adalah kondusif untuk penyelenggaraan. Seperti berikut:
Pastikan anda menulis atribut pembina, jika tidak, ralat penunjuk akan berlaku Pada masa ini, objek prototaip ditulis semula Jika atribut ini tidak dinyatakan, rantai prototaip tidak akan dapat memainkan peranannya.
Terdapat banyak perbezaan antara warisan prototaip dan pembina.
Rantai prototaip tidak sempurna, ia mengandungi dua masalah berikut.
Memandangkan perkara ini, pada praktiknya rantai prototaip jarang digunakan secara bersendirian.
Untuk tujuan ini, akan ada beberapa percubaan di bawah untuk mengimbangi kekurangan rantaian prototaip.
Meminjam pembina
Untuk menyelesaikan dua masalah di atas dalam rantai prototaip, kami mula menggunakan teknologi yang dipanggil meminjam pembina (pembina mencuri) (juga dipanggil warisan klasik).
Jelas sekali, meminjam pembina menyelesaikan dua masalah utama rantaian prototaip dalam satu kejadian:
Pertama, ia memastikan kebebasan nilai jenis rujukan dalam rantaian prototaip dan tidak lagi dikongsi oleh semua keadaan;
Kedua, semasa membuat subjenis, anda juga boleh menghantar parameter kepada jenis induk.
Berikutan ini, jika anda hanya meminjam pembina, anda tidak akan dapat mengelakkan masalah corak pembina - kaedah semuanya ditakrifkan dalam pembina, jadi penggunaan semula fungsi tidak tersedia dan Kaedah jenis super ditakrifkan dalam (seperti Bapa) juga tidak dapat dilihat oleh subjenis. Memandangkan ini, teknik peminjaman pembina jarang digunakan.
Untuk maklumat lanjut, sila rujuk rantai prototaip dan warisan JS anda menyukainya, sila berikan ibu jari dan sokongnya, terima kasih!