Untuk memahami objek JavaScript, kita dapat mulai dari pembuatan objek, operasi properti, dan metode objek. Untuk meringkas, itu termasuk modul berikut:
1. Buat objek
1.1 Pengukuran Objek Langsung
Jumlah langsung suatu objek adalah cara termudah untuk membuat objek, dan terdiri dari beberapa pasangan nama/nilai:
var point = {x: 0, y: 0};Tidak ada batasan untuk atribut nama. Mereka bisa menjadi kata kunci JS atau string apa pun. Jika kedua situasi ini, atribut perlu dilampirkan dalam kutipan ganda:
var kosong = {}; va point = {x: 0, y: 0}; var book = "judul utama": "javascript", "sub-judul": "panduan definitif", "untuk": "semua audiens", penulis: {firstName: "davide", lastname: "flanagan"}};Sangat sederhana untuk membuat objek secara langsung, tetapi umumnya tidak digunakan dengan cara ini. Kode ini dapat digunakan kembali. Jika Anda ingin menggunakan objek di tempat lain dan nilai atributnya berbeda, maka lakukan ini? Apakah Anda harus membuat ulang kode lain?
1.2 Buat Objek Melalui Baru
Sebelum membuat objek melalui yang baru, Anda harus terlebih dahulu membuat fungsi, dan memperlakukan baru fungsi ini sebagai konstruktor. Misalnya, buat objek seseorang melalui baru:
function person () {// constructor} var orang = orang baru ();Jenis primitif di inti bahasa JavaScript semuanya berisi konstruktor bawaan:
var a = array baru (); var d = tanggal baru (); var r = regexp baru ("js");1.3 objek.create ()
Sebelum kita memahami metode Create of Object, kita ingin melihat apa itu prototipe. Setiap objek JavaScript (kecuali null) dikaitkan dengan objek lain. Objek "lain" adalah apa yang kita sebut prototipe. Setiap objek mewarisi atribut dari prototipe.
Semua objek yang dibuat melalui Objek Kuantitas Langsung memiliki objek objek prototipe yang sama. PROTOTYPE. Prototipe objek yang dibuat oleh kata kunci baru dan konstruktor adalah nilai properti prototipe konstruktor. Prototipe objek yang dibuat melalui array baru () adalah array.prototype, dan prototipe objek yang dibuat melalui tanggal baru () adalah tanggal.prototype. Prototipe telah diperkenalkan di sini.
Metode Object.Create berisi dua parameter. Parameter pertama adalah prototipe objek dan parameter kedua adalah opsional untuk menggambarkan sifat objek. Mudah digunakan, cukup lewati objek prototipe yang diperlukan:
var o1 = object.create ({x: 1, y: 2}); // prototipe adalah objek.prototypeJika Anda ingin membuat objek tanpa prototipe, Anda dapat meneruskan nol sebagai parameter. Objek yang dibuat dengan cara ini tidak mewarisi properti apa pun, dan tidak ada metode seperti Tostring:
var o2 = object.create (null); // Tidak ada prototipe
Jika Anda ingin membuat objek kosong normal, berikan langsung ke objek. Prototipe:
var o3 = object.create (object.prototype);
Jika itu adalah objek khusus, itu sama dengan membuat objek kosong. Lewati nama objek secara langsung. Prototipe:
function person () {} var o4 = object.create (person.prototype);2. Manajemen Atribut
2.1 Kueri dan Pengaturan Properti
Properti suatu objek dapat diperoleh melalui operator titik (.) Atau braket persegi ([]). Jika Anda menggunakan titik untuk mendapatkan atribut, nama atribut harus menjadi indikator sederhana. Itu tidak bisa menjadi kata yang dipesan, seperti o.for atau o.class.
AR Author = Book.Author; // benar var name = author.surname; // judul var yang benar = buku ["judul utama"]; // benar var classname = book.class; //Kesalahan
Sintaks objek ["properti"] lebih mirip array, kecuali bahwa elemen array ini diindeks oleh string daripada angka. Jenis array ini adalah apa yang kita sebut array asosiatif, juga dikenal sebagai hash, peta atau kamus. Objek JavaScript adalah array asosiatif.
Karena objek adalah array asosiatif, JavaScript juga memberi kita metode untuk/masuk ke dalam properti traverse. Contoh berikut digunakan untuk/dalam untuk menghitung nilai total portofolio:
fungsi getValue (portofolio) {var total = 0,0; untuk (stok di portolio) {var shares = portolio [stock]; var harga = getQuote (stock); Total += Saham * Harga; } return total;}Warisan: Objek JavaScript memiliki sifatnya sendiri, dan beberapa properti diwarisi dari objek prototipe. Pertama -tama mari kita lihat warisan fungsi yang mengimplementasikan warisan:
fungsi warisan (p) {if (p == null) throw typeError (); // p adalah objek, tidak bisa nol if (object.create) {return object.create (p); // Gunakan metode Object.Create secara langsung} var t = typeof p; if (t! == "objek" && t! == "function") throw typeError (); fungsi f () {}; f.prototype = p; // Atur atribut prototipe ke p return baru f ();}Misalkan Anda ingin menanyakan atribut x objek o. Jika x tidak ada di O, Anda akan terus menanyakan atribut x dalam objek prototipe O. Jika tidak ada X di objek prototipe, tetapi objek prototipe juga memiliki prototipe, maka terus jalankan kueri pada prototipe objek prototipe sampai X ditemukan atau objek nol ditemukan.
var o = {}; // Atribut Objek OinHerit OX = 1 dari Object.prototype; // Tentukan atribut x untuk o var p = warisan (o); // PinHerit o dan object.prototypep.y = 2; // Atribut PDefine yvar q = warisan (p); // QinHerit P, O dan Object.prototypeq.z = 3; // Tentukan atribut zvar s = q.toString (); // tostring mewarisi dari objek.prototypeq.x + qy // => 3: x dan y diwariskan dari O dan P masing -masing2.2 Hapus atribut
Operator Hapus dapat menghapus properti objek:
hapus buku.author; hapus buku ["judul utama"];
Hapus hanya dapat menghapus atributnya sendiri, dan tidak dapat menghapus atribut yang diwariskan. Untuk menghapus properti yang diwariskan, itu harus dihapus dari objek prototipe yang mendefinisikan properti, dan ini mempengaruhi semua objek yang diwarisi dari prototipe. Penghapusan akan kembali benar.
ar o = {x: 1}; hapus sapi; // hapus x dan return truedelete sapi; // X tidak ada lagi, tidak ada yang dilakukan, kembali benar. hapus o.tostring; // tidak melakukan apa -apa, kembali benar. Hapus tidak dapat menghapus atribut dengan tipe false yang dapat dikonfigurasi. Properti beberapa objek bawaan tidak dapat dikonfigurasi, seperti properti objek global yang dibuat melalui deklarasi variabel dan deklarasi fungsi: hapus objek.prototype // tidak dapat dihapus, properti tidak dapat dikonfigurasi var x = 1; hapus ini.x; // properti ini tidak dapat dihapus fungsi f () {} hapus this.f; // Fungsi global tidak dapat dihapus2.3 Mendeteksi sifat
Untuk menentukan apakah suatu properti ada dalam suatu objek, itu dapat dideteksi oleh metode Operator, HasownProperty () dan PropertyIseNumerable ().
Di Operator: Operator adalah nama properti di sebelah kiri dan objek di sebelah kanan. Kembalikan true jika atribut objek atau atribut yang diwariskan berisi atribut:
var o = {x: 1}; "x" di o; // true: x adalah atribut "y" di o; // Salah: y bukan atribut "tostring" di o; // Benar: o mewarisi atribut tostringMetode HasownProperty (): Mendeteksi apakah nama yang diberikan adalah properti objek sendiri. Untuk atribut yang diwariskan itu akan mengembalikan false:
var o = {x: 1}; o.hasownproperty ("x"); // true: o memiliki properti gratis xo.hasownproperty ("y"); // Salah: tidak ada properti yo.hasoenproperty ("tostring"); // Salah: Tostring adalah properti warisanMetode PropertyIseNumerable (): adalah versi yang disempurnakan dari HasownProperty. Ini akan mengembalikan true hanya jika properti sendiri terdeteksi dan properti ini dianggap benar:
var o = whereit ({y: 2}); ox = 1; o.propertyisenumerable ("x"); // true: o memiliki properti yang dapat dihindarkan xo.propertyisenumerable ("y"); // Salah: y adalah objek yang diwariskan.prototype.propertyisenumerable ("tostring"); // Salah: tidak dapat dihitung2.4 Properti Pencacahan
Biasanya, untuk/dalam digunakan untuk mengulangi sifat objek, dan sifat yang dilintasi mencakup properti mereka sendiri dan properti yang diwariskan. Metode warisan objek bawaan tidak dapat dihitung, tetapi properti yang ditambahkan ke objek dalam kode dapat dihitung. Misalnya:
var o = {x: 1, y: 2, z: 3}; // tiga properti yang dapat dihindarkan o.propertyisenumable ("tostring"); // false, tidak dapat disebutkan untuk (p in o) // transfer properti console.log (p); // output x, y dan z, tidak ada output tostringTerkadang kita hanya ingin mengulangi properti kita sendiri, dan propertinya bukan fungsi:
untuk (p in o) {if (! o.hasownproperty (p)) lanjutkan; if (typeof o [p] === "fungsi") lanjutkan;}Kita dapat menyalin atribut yang dapat dihindarkan melalui fungsi traversal enumerasi:
/** Copy the enumerable attributes in p into o and return o* If o and p contain attributes of the same name, overwrite the attributes in o* This function does not handle getters and setters and copy attributes*/function extend(o, p){ for(prop in p){ //Transfer all attributes in p o[prop] = p[prop]; // Tambahkan atribut ke o} return o;}ES5 mendefinisikan dua fungsi yang menyebutkan nama atribut. Yang pertama adalah Object.keys (), yang mengembalikan array yang terdiri dari nama atribut yang dapat dihindarkan dalam objek. Fungsi enumerasi kedua adalah object.getOwnPropertynames (), yang mirip dengan objek.keys (), yang mengembalikan semua properti objek sendiri, bukan hanya properti yang dapat dihindarkan.
3. Entribute enkapsulasi
3.1 Atribut Getter and Setter
Atribut objek terdiri dari nama, nilai dan satu set atribut. Dalam ES5, nilai atribut dapat diganti dengan satu atau dua metode, yang merupakan pengambil dan setter. Atribut yang ditentukan oleh getters dan setter disebut "atribut aksesor". Tidak seperti "atribut data", atribut data hanya memiliki satu nilai sederhana.
Tidak seperti atribut data, atribut Accessor tidak dapat ditulis. Jika properti memiliki metode Getter dan Setter, maka itu adalah properti baca/tulis. Jika hanya memiliki metode Getter, maka itu adalah properti baca saja, jika hanya memiliki metode setter, maka itu adalah properti yang hanya menulis. Membaca atribut write-only selalu kembali tidak ditentukan.
Sintaks Definisi Atribut Accessor juga relatif sederhana. Definisi fungsi tidak menggunakan kata kunci fungsi, tetapi menggunakan Get atau Set:
var o = {// Atribut data biasa Data_prop: 1, // Atribut Accessor Semua fungsi yang ditentukan berpasangan dapatkan accessor_prop () {/* Berikut adalah badan fungsi*/}, atur accessor_prop (value) {}};Pikirkan tentang objek berikut yang mewakili koordinat poin Cartesian 2D. Ini memiliki dua sifat normal X dan Y mewakili koordinat X dan koordinat Y masing -masing. Ini juga memiliki dua properti aksesor yang setara untuk mewakili koordinat kutub poin:
var p = {// x dan y adalah atribut data baca-write biasa x: 1.0, y: 1.0, // r adalah atribut aksesor baca-write, yang memiliki pengambil dan setter get r () {return math.sqrt (this.x * this.x + this.y * this.y); }, atur r (newValue) {var oldvalue = math.sqrt (this.x * this.x + this.y * this); rasio var = newValue / oldValue; this.x *= rasio; this.y *= rasio; }, // theta adalah atribut aksesor read-only, hanya metode getter get theta () {return math.atan2 (this.y, this.x); }};Seperti atribut data, atribut aksesor diwariskan, sehingga objek P dalam kode di atas dapat dianggap sebagai prototipe dari "titik" lain. Ini dapat menentukan sifat x dan y untuk objek seksual, tetapi sifat R dan theta mewarisi dari:
var q = warisan (p); qx = 1, qy = 1; console.log (qr); cosole.log (q.theta);
3.2 Fitur Atribut
Kami dapat menganggap metode pengambil dan setter dari atribut Accessor sebagai karakteristik atribut. Menurut logika ini, kita juga dapat melihat karakteristik properti dari properti juga. Oleh karena itu, dapat dipertimbangkan bahwa suatu properti berisi nama dan 4 atribut.
Empat karakteristik properti numerik adalah nilainya, dapat ditulis, dapat dinyatakan dan dapat dikonfigurasi.
Atribut Accessor tidak memiliki karakteristik nilai dan kewaspadaan, sehingga mereka termasuk: baca (get), tulis (set), enumerasi, dan konfigurasi.
ES5 mendefinisikan objek bernama "deskriptor atribut", yang mewakili 4 atribut tersebut. Atribut objek deskriptor dari atribut data termasuk nilai, writable, enumerable dan dapat dikonfigurasi. Objek deskriptor dari atribut Accessor digantikan oleh atribut GET dan atribut SET. Di antara mereka, yang dapat ditulis, dapat dihindarkan, dan dapat dikonfigurasi adalah nilai boolean, dan atribut GET dan atribut yang ditetapkan adalah nilai fungsi.
Anda bisa mendapatkan deskriptor properti untuk properti tertentu dari suatu objek dengan memanggil objek.getOwnPropertyDescriptor ():
// return {value: 1, writable: true, enumerable: true, configable: true} object.getOwnProeprtyDescriptor ({x: 1}, "x"); // kueri properti oktet dari objek acak yang ditentukan di atas // return {get: func */, set: tidak dapat didefinisikan, enumerabor, random: randum: true- true, funct. "Octet"); // Untuk atribut yang diwariskan dan atribut yang tidak ada, return undefinedObject.getOwnPropertyDesciptor ({}, "x"); objek.getOwnPropertyDesciptor ({}, "tostring");Seperti yang dapat Anda lihat dari nama fungsi, objek.getOwnPropertyDesciptor () hanya bisa mendapatkan deskriptor dari propertinya sendiri. Untuk mendapatkan karakteristik atribut yang diwariskan, Anda perlu melintasi rantai prototipe (objek.getPrototypeOf ()).
Jika Anda ingin mengatur properti properti, atau membuat properti yang baru dibuat memiliki properti tertentu, Anda perlu memanggil objek.Defineproperty (), yang berisi tiga parameter: objek, nama properti, dan objek deskriptor properti:
// Sifat ada, tetapi sapi tidak dapat disebutkan; // => 1object.keys (o) // => [] // Sekarang ubah properti x untuk membuatnya objek read-only.defineproperty (o, "x", {writable: true}); // tampilan mengubah nilai properti ini ox = 2; // Operasi gagal tetapi tidak ada kesalahan yang dilaporkan, dan pengecualian kesalahan tipe dilemparkan dalam mode ketat // Properti masih dapat dikonfigurasi, sehingga dapat dimodifikasi dengan cara ini: objek.defineproperty (o, "x", {value: 2}); ox // = 2 // sekarang memodifikasi x dari properti data ke objek properti Accessor.def. return 0;}}); ox // => 0Jika Anda ingin memodifikasi atau membuat banyak properti secara bersamaan, Anda perlu menggunakan objek.defineproPerties (). Parameter pertama adalah objek yang akan dimodifikasi, dan parameter kedua adalah tabel pemetaan. Misalnya:
var p = object.defineproPerties ({}, {x: {value: 1, writable: true, enumerable: true, configable: true}, y: {value: 2, writable: true, enumerable: true, true: true}, r: {get: function () {return math.sqrt, this. enumerable: true, dapat dikonfigurasi: true}});API kuno untuk Getters and Setters: Sebelum ES5, sebagian besar implementasi JavaScript sudah dapat mendukung Get dan mengatur penulisan dalam sintaks kuantitas langsung objek. Implementasi ini menyediakan API kuno yang tidak standar untuk meminta dan menetapkan getters dan setter. API ini terdiri dari empat metode, dan semua objek memiliki metode ini.
__LookUpgetter __ () dan __LookUpsetter __ () digunakan untuk mengembalikan metode Atribut Getter and Setter bernama.
__DefineGetter __ () dan __Definesetter __ () digunakan untuk mendefinisikan getter dan setter. Parameter pertama adalah nama atribut, dan parameter kedua adalah metode pengambil dan setter.
var o = {}; o .__ defineGetter __ ("x", function () {return 0;}); o .__ Definesetter __ ("y", function (value) {console.log ("set value:" + value);});4. Tiga properti suatu objek
Setiap objek memiliki prototipe, kelas, dan atribut yang dapat diperluas yang terkait dengannya. Selanjutnya, mari kita bicara tentang apa yang dilakukan atribut ini.
4.1 Properti Prototipe
Atribut prototipe suatu objek digunakan untuk mewarisi atribut. Kami sering menyebut "atribut prototipe O" secara langsung "prototipe O". Sebelumnya, "Buat Objek" memperkenalkan tiga cara untuk membuat objek. Objek yang dibuat oleh objek digunakan sebagai prototipe mereka menggunakan objek.prototype. Objek yang dibuat oleh baru menggunakan atribut prototipe konstruktor sebagai prototipe mereka. Objek yang dibuat dengan objek.create () Gunakan parameter pertama sebagai prototipe mereka.
Dalam ES5, prototipe objek dapat ditanyakan melalui objek.getPrototypeOf (). Dalam ES3, tidak ada fungsi yang setara, tetapi sebaliknya ekspresi O.Constructor.prototype digunakan untuk memeriksa prototipe objek.
Untuk mendeteksi apakah suatu objek adalah prototipe objek lain (atau dalam rantai prototipe), gunakan metode isPrototypeOf (). Misalnya, Anda dapat mendeteksi apakah P adalah prototipe O oleh p.isprototipe (O):
var p = {x: 1}; // tentukan objek prototipe var o = objek.create (p); // Gunakan prototipe ini untuk membuat objek p.isprototypeof (o); // => true, o mewarisi dari pObject.prototype.isprototypeof (o) // => true, p mewarisi dari objek.prototypeJavaScript yang diimplementasikan oleh Mozilla memperlihatkan atribut yang secara khusus bernama __proto__ untuk secara langsung menanyakan/mengatur prototipe objek. Namun, IE dan Opera tidak mendukung atribut __proTo__, sehingga tidak disarankan untuk menggunakan atribut __proto__ secara langsung.
4.2 Atribut Kelas
Atribut kelas objek adalah string untuk mewakili informasi jenis objek. Baik ES3 dan ES5 menyediakan metode untuk mengatur properti ini, dan hanya ada satu cara tidak langsung untuk menanyakannya. Metode default tostring () mengembalikan string dalam format ini: [kelas objek].
Anda dapat memanggil metode tostring () dan kemudian mengekstrak karakter antara posisi kedelapan dan kedua dari string yang dikembalikan. Tetapi ada masalah bahwa banyak objek mewarisi metode tostring () telah ditulis ulang. Agar dapat memanggil versi tostring () yang benar, metode function.call () harus dipanggil secara tidak langsung. Fungsi classof dalam contoh berikut dapat mengembalikan kelas objek apa pun:
function classof (o) {if (o === null) return "null"; if (o === tidak terdefinisi) kembali "tidak ditentukan"; return object.prototype.tostring.call (o) .slice (8, -1);}4.3 Skalabilitas
Perpanjangan objek digunakan untuk menunjukkan apakah properti baru dapat ditambahkan ke objek. Semua objek bawaan dan kustom secara eksplisit dapat diperluas. Dalam ES5, objek dapat dikonversi menjadi tidak dapat ditentukan.
Selain mengatur objek menjadi tidak ekstensible, metode objek.seal () juga dapat mengatur semua sifat objek sendiri agar tidak dapat dikonfigurasi. Artinya, atribut baru tidak dapat ditambahkan ke objek, dan atribut yang ada tidak dapat dihapus dan dikonfigurasi.
Metode objek.issealed () digunakan untuk mendeteksi apakah objek terlampir.
Metode objek.freeze () akan mengunci objek lebih ketat. Selain memiliki fungsi dari metode objek.seal (), ia juga dapat mengatur semua atribut datanya sendiri ke read-only (jika atribut aksesor objek memiliki metode setter, atribut accessor tidak terpengaruh, dan Anda masih dapat memanggilnya dengan menetapkan nilai ke atribut).
Object.isfrozen () digunakan untuk mendeteksi apakah objek dibekukan.
5. Serial Objek
Serialisasi objek mengacu pada mengubah keadaan objek menjadi string, atau Anda dapat mengembalikan string ke suatu objek. ES5 menyediakan fungsi bawaan json.stringify () dan json.parse () untuk membuat serialisasi dan mengembalikan objek JavaScript. Semua metode ini menggunakan JSON sebagai format pertukaran data. Misalnya:
o = {x: 1, y: {z: [false, null, ""]}}; // Tentukan objek uji s = json.stringify (o); // {"x": 1, "y": {"z": [false, null, ""]}} p = json.parse (s); // P adalah salinan yang dalam dari OSintaks JSON adalah subset dari sintaks JavaScript, dan tidak dapat mewakili semua nilai dalam JavaScript. Objek, array, string, angka tak terbatas, benar, salah, dan nol didukung, dan mereka dapat diserialisasi dan dipulihkan. Hasil serialisasi NAN, Infinity dan -infinity semuanya nol. Fungsi, Regexp, objek kesalahan, dan nilai yang tidak ditentukan tidak dapat diserialisasi dan dipulihkan.
Di sini saya akan menambahkan metode objek:
Metode ToString (): Ini akan mengembalikan string yang mewakili nilai objek yang menyebut metode ini. Banyak objek telah menulis ulang metode tostring (), seperti array.tostring (), date.tostring () dan function.toString ().
Metode TOJSON (): Object.Prototype tidak benar -benar mendefinisikan metode TOJSON (), tetapi karena kebutuhan untuk melakukan serialisasi, metode JSON.Stringify () akan memanggil metode TOJSON (). Jika metode ini ada di objek serial, itu dipanggil.
Metode valueOf (): Nilai metode () sangat mirip dengan metode ToString (), tetapi JavaScript sering menyebutnya ketika mengonversi objek ke nilai asli tertentu daripada string, terutama ketika dikonversi ke angka. Beberapa kelas bawaan menyesuaikan metode nilai (), seperti date.valueof ().
Artikel di atas secara komprehensif memahami kemajuan objek JavaScript adalah semua konten yang saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.