1. Nilai asli dan nilai referensi
Nilai asli disimpan di tumpukan, dan nilai referensi disimpan di tumpukan. Seperti program:
Copy kode kodenya sebagai berikut:
fungsi Orang(id,nama,umur){
ini.id = id;
ini.nama = nama;
this.usia = usia;
}
varnum = 10;
var bol = benar;
varstr = "abc";
var obj = Objek baru();
var arr = ['a','b','c'];
var person = new Person(100,"Motto Idiot",25);
2.tidak terdefinisi dan nol
tidak terdefinisi: Variabel tidak terdefinisi; ini adalah nilai eksklusif dengan tipe Tidak Terdefinisi;
null: Referensi tidak dialokasikan; ini adalah nilai eksklusif bertipe Null.
typeof(tidak terdefinisi) == tidak terdefinisi;
typeof(null) == objek;
tidak terdefinisi==null;
tidak terdefinisi!==batal;
null instanceof Objek == false;
instanceof Objek yang tidak terdefinisi == false;
Meskipun terdapat tipe Undefinisi dan Null, contoh berikut menggambarkan bahwa kedua tipe ini tidak terlihat, artinya kita hanya dapat menggunakan nilainya:
alert(contoh tidak terdefinisi dari Tidak terdefinisi);
alert(null instance dari Null);
3. Susunan semu
Fitur:
1) Memiliki atribut panjang;
2) Akses data dalam urutan indeks seperti array;
3) Tidak ada metode manipulasi data khusus array seperti push, pop, slice...
Array semu dapat diubah menjadi array nyata melalui Array.prototype.slice:
var faceArray = {0: 'a', 1: 'b', panjang: 2}//Array semu standar;
var realArray = Array.prototype.slice.call(fakeArray);
Array semu di js: argumen, node.childNodes, document.getElementsByTagName()...
Masalah di IE: node.childNodes di IE tidak dapat dikonversi dengan irisan.
Array semu di Jquery: Jquery sendiri adalah array semu:
peringatan($('.kelas1').panjang); peringatan($('.kelas1').[0].tagName);
4. Tentang tipe literal sederhana
var a = 1; b = benar, c = "ccc";
Literal tampaknya memiliki tipe
peringatan(tipe a);//angka
peringatan(tipe b);//boolean
peringatan(tipe c);//string
Tapi itu tidak bisa diukur melalui instanceof.
alert(sebuah contoh Nomor)//false
alert(sebuah instance dari Objek)//false
peringatan(b contoh Boolean)//false
peringatan(b instanceObjek)//false
peringatan(c instanceof String)//salah
peringatan(c instanceof Objek)//false
5. Atribut prototipe dari fungsi dan atribut prototipe internal dari instance objek
Setiap fungsi (konstruktor) memiliki atribut prototipe, dan setiap instance objek memiliki atribut prototipe internal yang tidak terlihat (mozilla menjadikannya publik dan dapat diperoleh melalui __proto__), yang menunjuk ke atribut prototype dari konstruktor properti prototipe sendiri, yang membentuk rantai prototipe. Objek adalah objek teratas, sehingga semua rantai prototipe pada akhirnya akan menunjuk ke Objek.prototipe. Saat mengakses properti/metode dari instance objek, Mulailah mencari dari instance objek itu sendiri. Jika tidak dapat ditemukan, cari ke atas sepanjang rantai prototipe hingga Object.prototype.prototype == null.
6. Sedikit rahasia konstruktor
Copy kode kodenya sebagai berikut:
var s = fungsi baru(){return "sss"};
peringatan;//[Objek Objek]
s = fungsi baru(){kembalikan String baru("sss")};
peringatan;//sss
Penjelasan kode ini:
Selama konstruktor setelah ekspresi baru mengembalikan objek referensi (array, objek, fungsi, dll.), ia akan menimpa objek anonim yang dibuat oleh yang baru. Jika ia mengembalikan tipe primitif (bila tidak ada pengembalian, ia benar-benar kembali tipe primitif undefinisi ), maka objek anonim yang dibuat oleh new dikembalikan.
7. Proses pembuatan objek
Copy kode kodenya sebagai berikut:
fungsi Orang(nama){
ini.nama = nama;
}
Orang.prototipe = {
getName: function(){kembalikan ini.nama}
};
var p = Orang baru('zhangsan');
Dekripsi proses pembuatan p:
◦Buat objek objek bawaan dan inisialisasi;
◦Arahkan [[Prototipe]] internal dari p ke Person.prototype;
◦Gunakan p seperti ini dan gunakan parameter argumen untuk memanggil metode [[Panggilan]] internal Person, yaitu, jalankan isi fungsi Person dan kembalikan nilai yang dikembalikan.
◦Jika langkah sebelumnya mengembalikan tipe Objek, kembalikan nilai ini ke p, jika tidak, kembalikan objek.
8. Properti benda itu sendiri dan properti yang diwariskan
Copy kode kodenya sebagai berikut:
fungsi Orang(nama){
ini.nama = nama;
}
Orang.prototipe = {
ketik: 'manusia',
getName: function(){kembalikan ini.nama}
};
var p = Orang baru('zhangsan');
alert(p.hasOwnProperty('type'));//false
p.type = 'ren';
alert(p.hasOwnProperty('type'));//true
Hasil yang dijalankan sangat jelas. Properti suatu objek tidak dapat mengubah properti dengan nama yang sama di prototipenya, tetapi hanya akan membuat properti dengan nama yang sama dan memberikan nilai padanya.
9.Proses pembuatan objek fungsi
Buat objek bawaan objek fn;
Atur [[Prototipe]] internal fn ke Function.prototype;
Atur atribut internal [[Panggilan]], yang merupakan metode yang diterapkan secara internal yang menangani logika pemanggilan fungsi. (Secara sederhana dipahami sebagai menunjuk ke badan fungsi);
Setel fn.length ke funArgs.length. Jika fungsi tidak memiliki parameter, setel fn.length ke 0;
Konstruktor fn.prototype menunjuk ke fn itu sendiri;
Kembalikan fn.
10.Prinsip contoh
Untuk memeriksa apakah a merupakan turunan dari B, Anda perlu memeriksa apakah objek yang ditunjuk oleh prototipe B (atribut prototipe konstruktor) berada pada rantai prototipe a.
11. Tebakan Fungsi dan Objek
alert(Fungsi contoh Fungsi);//benar
alert(Fungsi instance dari Object);//true
alert(Objek instanceof Fungsi);//benar
alert(Objek contoh dari Objek);//benar
Aku sudah memikirkannya sejak lama, tapi aku belum menemukan jawabannya...