<script> function p () {var len = arguments.length; untuk (var i = 0; i <len; i ++) {document.write (argumen [i]+"<br/>"); }} function myclass (x, y) {this.x = x; this.y = y; this.show = function () {return this.x+this.y; }} var m1 = myclass baru (1,2); var m2 = myclass baru (3,4); p (m1.show (), m2.show ()); </script>Masalah yang ada
1. Karena semua instance menyalin entitas yang ditentukan oleh metode yang sama, efisiensi (efisiensi memori dan eksekusi yang tidak efisien) dapat diselesaikan melalui pewarisan prototipe.
2. Tidak dapat mengakses kontrol nilai atribut (pribadi, publik) dapat diselesaikan melalui penutupan
Objek operasi yang diakses oleh atribut bukanlah variabel tetapi referensi ke objek
Pemrosesan hanya membaca bagian integer dari nilai numerik
Matematika [ini <? 'Celling': 'Floor'] (ini);
Array asosiatif
Di JS, Anda harus meneruskan objek untuk mengimplementasikan array asosiatif
Operasi dasar dibuat oleh kunci, pengaturan elemen, dan penghapusan elemen.
<script> var map = {x: 3, y: 4}; p (map.x); hapus peta.x; //truep(map.x); // Tidak terdefinisi hasil mengakses elemen yang tidak ada tidak terdefinisi. Karena nilainya dapat ditetapkan untuk tidak terdefinisi, tidak mungkin untuk menilai apakah nilainya ada dengan membandingkan nilai dengan tidak terdefinisi. Anda dapat menyebutkannya dengan dalam a = 'tidak terdefinisi'; p (a); // undefinedp (typeof map.x == a); // true </script>Sebagai array asosiatif, Anda harus memperhatikan
<script> function myclass (x, y) {this.x = x; this.y = y;} myclass.prototype.z = 5; var obj = myclass baru (1,2); untuk (tombol var dalam obj) {p (key+":"+obj [key]); // Atribut yang diwarisi melalui prototipe akan disebutkan} // x: 1 y: 2 z: 5delete obj.x; // truep (obj.x); //undefinedp(obj.z); // 5 // Atribut yang diwarisi melalui prototipe tidak dapat dihapus dihapus obj.z; //truep(obj.z) ;//5///khen menggunakan objek sebagai array asosiatif, literal biasanya dibuat. Bahkan jika tampilan menggunakan objek kosong secara literal untuk membuat array asosiatif tanpa elemen, atribut prototipe p ('tostring' dalam obj); // truevar obj1 = {}; p ('toString' di obj1); // true // enumenp (obj1.length); // UndefinedFor (var k dalam obj1) {p (obj1 [k]);} // Tidak ada elemen yang disebutkan. Ini karena atribut yang dapat dinyatakan.//truevar obj1 = {}; p ('tostring' dalam obj1); // true // enumerasi enum dari p (obj1.length); // UndefinedFor (var k dalam obj1) {p (obj1 [k]);} // Tidak ada elemen yang disebutkan. Ini karena atribut yang dapat dihindarkan.//truevar obj1 = {}; p ('toString' dalam obj1); // true // atribut seperti diri sendiri diwariskan dengan berpartisipasi dalam prototipe peta = {}; p (peta.hasownproperty ('tostring')); //falsemap['ToString' versie=1 ;p(map.hasownproperty('ToString ')); // peta truedelete ['tostring']; p (peta.hasownproperty ('tostring')); // false </script>Atribut
Atribut objek juga memiliki beberapa atribut
Tabel berikut merangkum atribut yang ditentukan dalam edisi kelima ecmascript, dan nilai atribut didefinisikan sebagai atribut nilai.
Tabel 1
Nama atribut | arti |
dapat ditulis | Nilai atribut dapat ditulis ulang |
terhubungkan | Dapat disebutkan dengan untuk di |
dapat dikonfigurasi | Anda dapat mengubah atribut dan menghapus atribut |
mendapatkan | Fungsi pengambil yang menentukan nilai properti |
mengatur | Fungsi setter yang dapat menentukan nilai atribut |
Objek yang tidak dapat diubah
Artinya, objek yang keadaannya tidak dapat diubah setelah generasi, dan objek string adalah objek yang tidak dapat diubah.
Penggunaan objek abadi yang fleksibel dapat meningkatkan ketahanan program, seperti saat meneruskannya ke parameter metode, ada metode untuk menulis ulang konten objek, dll.
Objek yang tidak dapat diubah dapat diimplementasikan dalam JS
1. Sembunyikan atribut (status tersembunyi) dan jangan menyediakan operasi perubahan (implementasi penutupan)
2. Penggunaan fungsi yang fleksibel disediakan oleh ecmascript dalam edisi kelima
3. Penggunaan fleksibel dari atribut, setter, dan getters yang dapat dikonfigurasi
Fungsi yang digunakan untuk mendukung objek abadi dalam ecmascript versi 5 ditampilkan di tabel berikut
Nama metode | Atribut baru | Hapus atribut | Perubahan nilai atribut | Metode konfirmasi |
preverextensions | X | Hai | Hai | Objek.isextensible |
segel | X | X | Hai | Objek.Sisealed |
membekukan | X | X | X | Object.isfrozen |
Contoh Object.PreventExtensions
<script> var obj = {x: 2, y: 3}; object.preventextensions (obj); // tidak dapat menambahkan atribut obj.z = 4; p (objek.keys (obj)); // x, y // tidak dapat menghapus atribut obj.y; p (objek.keys (obj)); // x // tidak dapat menambahkan nilai atribut obj.x = 20; p (obj.x); //20//object.seal Contoh Menetapkan yang dapat dikonfigurasi dari atribut ke false var obj = {x: 2, y: 3}; objek.seal (obj); // tidak dapat menambahkan atau menghapus obj.z = 3; p (objek.keys (obj)); // x, ydelete obj.x; //falsep(Object.keys(obj)) ;//x,y/can mengubah nilai atribut obj.x = 20; p (obj.x); // 20 // objek.freeze contoh menetapkan nilai atribut ke false var obj = {x: 2, y: 3}; objek.freeze (obj); obj.z = 3; p (objek.keys (obj)); // x, y // dapat mengubah nilai atribut obj.x = 20; p (obj.x); // 20 </script>Perlu memperhatikan
1. Untuk tiga metode di atas, itu tidak dapat dipulihkan setelah diubah.
2. Jika Anda ingin membuat metode yang diwariskan dalam prototipe warisan tidak berubah, Anda perlu menampilkannya.