Rumah > Artikel > hujung hadapan web > Penjelasan terperinci tentang beberapa kaedah yang berbeza untuk mencipta objek dalam kemahiran JS_javascript
Artikel ini memperkenalkan beberapa kaedah mencipta objek dalam js dan berkongsi dengan anda untuk rujukan anda Kandungan khusus adalah seperti berikut
1. Mod kilang
Keburukan: Ia tidak menyelesaikan masalah pengecaman objek, iaitu cara mengetahui jenis objek.
2. Corak pembina
Berbanding dengan mod kilang:
1. Tiada penciptaan objek eksplisit
2. Tetapkan sifat dan kaedah secara langsung kepada objek ini
3. Tiada penyata pengembalian
Untuk membuat contoh orang, anda mesti menggunakan operator baharu Memanggil pembina dengan cara ini sebenarnya melalui 4 langkah:
1. Cipta objek baharu
2. Berikan skop pembina kepada objek baharu
3. Jalankan kod dalam pembina
4. Kembalikan objek baharu
Buat pembina tersuai untuk mengenal pasti contohnya sebagai jenis tertentu.
Kelemahan Pembina:
Setiap kaedah dicipta semula pada setiap kejadian. Kedua-dua person1 dan person2 mempunyai kaedah sayName(), tetapi kedua-dua kaedah tersebut bukanlah contoh Fungsi yang sama. Fungsi dengan nama yang sama pada keadaan berbeza adalah tidak sama.
Tidak perlu mencipta dua contoh Fungsi yang menyelesaikan tugas yang sama, dan masih terdapat objek ini Tidak perlu mengikat fungsi pada objek tertentu sebelum melaksanakan kod, seperti yang ditunjukkan di bawah.
Tetapkan atribut sayName kepada fungsi sayName global Dengan cara ini, memandangkan sayName mengandungi penunjuk ke fungsi, objek person1 dan person2 berkongsi fungsi yang sama.
Walau bagaimanapun, jika objek perlu mentakrifkan banyak kaedah, maka banyak fungsi global mesti ditakrifkan, dan tiada pengkapsulan jenis rujukan tersuai. Untuk menyelesaikan masalah di atas, mod prototaip diperkenalkan.
3. Mod prototaip
Memahami objek prototaip
Setiap fungsi yang kami cipta mempunyai atribut prototaip, yang merupakan penunjuk kepada objek, dan tujuan objek ini adalah untuk mengandungi sifat dan kaedah yang boleh dikongsi oleh semua kejadian jenis tertentu. Prototaip ialah prototaip objek bagi contoh objek yang dibuat dengan memanggil pembina Kelebihan menggunakan objek prototaip ialah semua contoh objek boleh berkongsi sifat dan kaedah yang terkandung di dalamnya.
Pertama, penghurai akan bertanya orang contoh1 sama ada ia mempunyai atribut nama, dan jika ya, ia akan mengembalikannya.
Jika tidak, teruskan mencari atribut nama dalam prototaip person1, dan kembali jika ada.
Jika tidak, teruskan mencari dalam prototaip prototaip person1.
isPrototypeOf() menentukan perkaitan antara contoh dan objek prototaip
console.log(Person.prototype.isPrototypeOf(person1)); //true
Object.getPrototypeOf() mengembalikan nilai [[prototype]]
console.log(Object.getPrototypeOf(person1));
//Person {name: “Yvette”, umur: 26, job: “engineer”} mengembalikan objek prototaip Person.
console.log(Object.getPrototypeOf(person1) === Person.prototype)//true
console.log(Object.getPrototypeOf(person1).name);//"Yvette"
Kaedah hasOwnProperty() boleh mengesan sama ada sifat wujud dalam contoh atau dalam prototaip Ia akan kembali benar hanya jika sifat yang diberikan wujud dalam contoh.
console.log(person1.hasOwnProperty(“nama”));//false
Prototaip dan dalam operator
Terdapat dua cara untuk menggunakan operator dalam: bersendirian dan dalam gelung untuk-dalam. Apabila digunakan bersendirian, pengendali dalam mengembalikan benar jika harta yang diberikan boleh diakses melalui objek, sama ada harta itu berada dalam contoh atau prototaip.
Menggunakan gelung untuk dalam, semua sifat terhitung yang boleh diakses melalui objek dikembalikan, termasuk sifat dalam contoh dan sifat yang wujud dalam prototaip. Ini juga akan dikembalikan jika harta dalam contoh itu menutupi harta tidak terhitung dalam prototaip. Terdapat pepijat dalam pelaksanaan versi sebelum atribut Instance IE9 yang menutup atribut yang tidak boleh dikira tidak akan dikembalikan dalam for-in.
Tiada maklumat log dalam butang sebelum IE9. Walaupun kaedah toString() dalam contoh orang menyekat toString() yang tidak boleh dikira dalam prototaip;
Singkatan prototaip
Ini menyebabkan person1.constructor tidak lagi menunjuk ke Person, tetapi ke Object. Jika pembina adalah penting, anda perlu menetapkannya secara khusus kepada nilai yang sesuai, seperti:
Tetapi pendekatan ini akan menyebabkan harta pembina menjadi terbilang.
Jika anda ingin menetapkannya menjadi tidak boleh dikira (lalainya tidak boleh dikira), anda boleh menggunakan Object.defineProperty(Person.prototype, “constructor”, {
enumerable: palsu,
nilai: Orang
});
Sifat dinamik prototaip
Memandangkan proses mencari nilai dalam prototaip ialah carian, sebarang perubahan yang kami buat pada objek prototaip akan ditunjukkan dengan serta-merta pada contoh.
Keadaannya berbeza jika keseluruhan objek prototaip ditindih. Apabila pembina dipanggil, penuding [[prototaip]] kepada prototaip asal ditambahkan pada contoh, dan mengubah suai prototaip kepada objek lain adalah bersamaan dengan memotong sambungan antara pembina dan prototaip asal. Penunjuk dalam contoh hanya menunjuk kepada prototaip, bukan pembina.
person.prototype menghala ke objek prototaip asal dan tidak menghala ke objek prototaip baharu.
Masalah dengan objek prototaip
Masalah terbesar dengan corak prototaip adalah disebabkan oleh sifat perkongsiannya.
Masalahnya lebih ketara untuk sifat yang mengandungi nilai jenis rujukan
Niat asal adalah untuk mengubah suai rakan person1, tetapi ia menyebabkan nilai atribut rakan person2 turut berubah. Oleh itu kami jarang menggunakan corak prototaip sahaja.
4. Gabungkan mod pembinaan dan mod prototaip
Cara paling biasa untuk mencipta jenis tersuai ialah menggunakan gabungan corak pembina dan corak prototaip. Corak pembina digunakan untuk mentakrifkan sifat contoh, dan corak prototaip digunakan untuk mentakrifkan kaedah dan sifat dikongsi Dengan cara ini, setiap contoh mempunyai salinan sifat contoh sendiri dan berkongsi rujukan kepada kaedah, yang menjimatkan memori ke tahap yang paling besar. .
Selain kaedah di atas, terdapat juga mod prototaip dinamik, mod pembinaan parasit dan mod pembinaan pepejal, tetapi disebabkan kekerapan penggunaan yang rendah, saya tidak akan menerangkan secara terperinci.