Pengantar Ecmascript5
Pertama-tama, kita harus mengetahui bahwa ecmascript adalah dewa-ma. Kita tahu bahwa JavaScript atau Livescript awalnya dibuat oleh Netscape, dan kemudian Microsoft juga menindaklanjuti untuk membuat JScript. Scriptease juga memiliki cenvi sendiri. Dengan cara ini, ada tiga versi skrip browser yang dilakukan sendiri. Semua orang memahami ini kacau, sehingga masalah standardisasi dimasukkan ke dalam agenda. Pada tahun 1997, proposal berdasarkan JavaScript1.1 diserahkan ke Asosiasi Produsen Komputer Eropa (komputer Eropa untuk produsen sektor). Akhirnya, semua orang mengembangkan ECMA-262, standar bahasa skrip baru yang disebut ecmascript. Tahun berikutnya, ISO/IEC (Organisasi Internasional untuk Standardisasi dan Komisi Elektroteknik Internasional) juga mengadopsi ecmascript sebagai standar. Setelah itu, dunia akan damai. Produsen browser utama menggunakan ecmascript sebagai dasar untuk implementasi JavaScript masing -masing. Tentu saja, itu hanya fondasi dan belum sepenuhnya diikuti. Kalau tidak, kami tidak akan memiliki begitu banyak masalah kompatibilitas browser.
Apa itu ecmascript5? Seperti namanya, ini adalah versi kelima dari hal yang aneh ini, seperti iPhone 5. ECMASCRIPT3, yang sering kita gunakan sekarang, dianggap sebagai bahasa pemrograman nyata daripada mainan, dan telah menjadi sangat populer.
teks:
Saya selalu memiliki pemahaman yang salah tentang Get/Set sebelumnya, dan saya pikir Get Set adalah metode atribut objek. Saya juga punya banyak pertanyaan setelah membaca blog orang lain. Hari ini, sistem melakukan banyak tes dan akhirnya mengetahuinya. (Jika Anda lulus tes demo membaca dan menulis sendiri, jika ada yang salah, Anda dipersilakan untuk mengkritik dan mengoreksi saya)
Get/Set Accessor bukan properti objek, tetapi properti properti. Setiap orang harus membedakan dengan jelas. Fitur hanya digunakan secara internal, sehingga tidak dapat diakses secara langsung di JavaScript. Untuk menunjukkan bahwa karakteristik adalah nilai internal terlampir dalam tanda kurung antara kedua tim, seperti [[nilai]].
1. Biarkan saya memperkenalkan karakteristik atribut ini secara singkat (berikut adalah dukungan sederhana)
(1) Atribut Data - Posisi yang berisi nilai data. Posisi ini dapat membaca dan menulis nilai.
Atribut data memiliki empat karakteristik yang menggambarkan perilaku mereka:
[[Dapat dikonfigurasi]]: Apakah dapat dikonfigurasi?
[[Enumerable]]: Apakah itu bisa dihitung?
[[Writable]]: apakah itu dapat dibaca
[[Nilai]]: Nilai atribut
(2) Atribut Atribut Accessor - Tidak berisi nilai data, berisi fungsi Getter and Setter (kedua fungsi ini tidak diperlukan)
Properti Accessor juga memiliki empat karakteristik yang menggambarkan perilaku mereka:
[[Dapat dikonfigurasi]]: Apakah dapat dikonfigurasi?
[[Enumerable]]: Apakah itu bisa dihitung?
[[Get]]: Fungsi dipanggil saat membaca atribut, default tidak ditentukan
[[Set]]: Fungsi dipanggil saat menulis atribut, default tidak ditentukan
2. Di sini kami fokus untuk memperkenalkan [[get]]/[set]] adalah apa yang kami sebut GET/set Accessor
Mari kita bicara tentang karakteristik perilaku dari Get/Set Accessor yang disebutkan dalam buku: Get/Set Accessor dapat dibaca dan ditulis tanpa definisi. Anda juga dapat mendefinisikan hanya satu. Jika saja didefinisikan, atribut yang dijelaskan hanya dapat dibaca dan tidak dapat ditulis. Jika hanya set yang didefinisikan, atribut yang dijelaskan hanya dapat ditulis dan tidak dapat dibaca.
(1) Metode set GET asli kami adalah sebagai berikut:
function foo (val) {var value = val; this.getValue = function () {value return;}; this.setValue = function (val) {vale = val;};} var obj = new foo ("hello"); warn (obj.getValue ()); // "hello" obj.setValue ("hi) (" hi) ("hi) (" hi) ("hi) (" hi) ("hi) (" hi "; hi) (" hi) ("hi"; hi "; hi) (" hi "; hi) (" hi);Kode di atas hanyalah metode GET Set yang diimplementasikan menggunakan ruang lingkup penutupan. Perhatikan bahwa metode ini adalah metode atribut dari objek instan, bukan properti atribut. Jika tidak ditentukan, nilai nilai tidak akan dapat diakses
function foo (val) {var value = val;/* this.getValue = function () {value return;}; this.setValue = function (val) {value = val;};*/} var obj = new foo ("hello"); alert (obj.value); // tidak ditentukanContoh -contoh berikut juga adalah metode atribut objek, bukan properti atribut.
var obj = {name: "John", get: function () {return this.age;} // Hanya dapatkan yang didefinisikan, set tidak didefinisikan, tetapi masih dapat membaca, menulis, dan nama atribut nama, bahkan jika itu adalah usia // metode yang didefinisikan di sini tidak akan mempengaruhi atribut GET, set dari atribut. Hanya atribut objek normal}; waspada (obj.name); // john readable obj.name = "jack"; // writable alert (obj.name); // jack(2) Dapatkan/atur accessor sebagai properti dari atribut Accessor.
Sekali lagi, ini bukan atribut objek, mereka memutuskan apakah atribut dapat dibaca dan ditulis. Jika tidak diatur, tidak apa -apa, sama seperti membaca dan menulis secara normal (properti dapat dibaca atau dibaca
Tulis, baca, dan tulis akses ke properti itu sendiri)
Ada dua cara untuk mengubah atribut Get /Set:
A. Gunakan Object.Defineproperty ()
var object = {_ name: "daisy"}; object.definepropery (objek, "name", {// nama metode di sini berarti bahwa properti nama didefinisikan (sehingga dapat diakses melalui objek.name), hanya pengembaraan yang ditulis, tidak ada yang dibaca, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak dapat ditulis, tidak ada nilai, tidak ada. this._name;}}); waspada (object.name); // "Daisy" object.name = "jack"; // Hanya pengacau pengambil yang didefinisikan, sehingga penulisannya tidak valid (Object.name); // "Daisy" Object.name = "jack"; // Hanya pengacau yang dibatalkan, DAISY "Tulisan.Perhatikan bahwa nama properti di objek.defineproperty (objek, pro, {}) harus sesuai dengan properti yang diakses oleh objek.pro.
B. Gunakan kata kunci Get Set:
var object = {_ name: "Daisy", get name () {// Nama metode di sini berarti bahwa atribut nama didefinisikan (sehingga dapat diakses melalui objek.name), hanya aksesor getter yang didefinisikan, tidak ada nilai [nilai]] yang didefinisikan. Kembalikan this._name;} // dapatkan, metode set hanyalah properti atribut, bukan metode objek, yang menentukan apakah atribut dapat dibaca dan ditulis}; alert (object.name); // daisy metode untuk menghapus garis bawah di sini adalah daisy; Plus itu tidak terdefinedObject.name = "jack"; // Hanya pengaksak pengambil yang didefinisikan, sehingga hanya dapat dibaca tetapi tidak menulis peringatan (objek.name); // daisyDua metode di atas setara. Perhatikan bahwa kedua metode di atas akan memiliki dua atribut dalam objek objek: _name (dengan nilai awal) nama (tanpa nilai awal), yang dapat dilihat melalui konsol browser.
Jadi kapan atribut nama ini benar -benar ditentukan? Kita tahu objek.defineproperty (objek, pro, {}) dapat mendefinisikan pro properti baru untuk objek. Karena Get Pro () {}/set Pro () {} dan object.defineproperty (objek, pro, {}) setara, pro properti baru juga akan didefinisikan. Inilah sebabnya mengapa ada dua properti dalam objek.
(3) Kode implementasi GET dan Set Accessor dalam JavaScript dalam artikel ini: Terkait dengan implementasi GET dan Atur Accessor Standar Standar: Pikiran yang masuk akal
Saya sendiri menulis contoh
fungsi foo (val) {this.value = val; // atribut nilai didefinisikan dan tidak _value} foo.prototype = {set value (val) {// Perhatikan bahwa nama metode dan nama atributnya, dan nilai atribut yang sama dan namanya, dan nilai yang sama (), namanya, dan nilai yang sama (), namanya, dan nilai, dan nilai yang sama (), Get Nilai (), Nilai, dan Nilai, dan Nilai, dan Nilai Nilai (), Get Nilai (), Get Nilai (), Nilai, dan Nilai, dan Nilai, dan Nilai Nilai, dan Nilai (), Nilai, dan Nilai Nilai (), Nilai, dan Nilai, dan Nilai Nilai, dan Nilai (). Atribut didefinisikan dalam prototipe return this._value;}}; // Accessor mengembalikan dan mengatur keduanya _name, dan tidak ada definisi di sini. Mengapa itu bisa dibaca atau ditulis? ? ? ? var obj = foo baru ("halo"); waspada (obj.value); // "halo" obj.value = "yehoo"; waspada (obj.value); // "yehoo"Untuk menyelesaikan pertanyaan di atas, banyak tes telah dilakukan, mari kita lihat satu per satu:
Pertama -tama lihat contoh ini. Hanya fitur GET yang didefinisikan dalam prototipe. Saat membaca atribut nilai di obj.value, cari dalam contoh tanpa itu, dan kemudian temukan dalam prototipe. Metode GET dipanggil, yang hanya bisa dibaca tetapi tidak ditulis.
function Foo(val){this._value=val;//The attribute here is underlined, initializes the _value attribute of the instance object, the _value attribute is readable and writable}Foo.prototype={// set value(val){// Note that the method name is the same as the attribute name, and the value attribute is defined in the prototype // this._value = val; //}, dapatkan nilai () {// Nama metode sama dengan nama atribut, mendefinisikan atribut nilai dan atribut GET dalam prototipe mengembalikan this._value;}}; var obj = foo baru ("halo"); waspada (obj.value); // halo mengakses nilai dalam prototipe atribut obj.value = "yehoo"; // Hanya mendefinisikan atribut GET dari atribut nama, sehingga hanya dapat dibaca tetapi tidak ditulis. Tulisannya tidak valid Alert (obj.value); // haloJika this._value dihapus dari garis bawah di konstruktor, atribut nilai yang ditentukan dalam prototipe mendefinisikan atribut GET. Anda masih dapat mengontrol bacaan dan menulis atribut nilai. Dengan kata lain, ketika OBJ.Value mengakses atribut, metode GET akan dipanggil, pertama -tama mencari di objek itu sendiri, jika tidak, kemudian mencari dalam prototipe. Jika tidak ada yang tidak, itu akan dianggap tidak terdefinisi. Standarnya dapat dibaca dan dapat ditulis.
function foo (val) {this.value = val; // Hanya fitur GET nilai yang didefinisikan dalam prototipe, sehingga penulisan di sini tidak valid} foo.prototype = {// set value (val) {// Perhatikan bahwa nama metode dan nama atributnya sama, fitur yang ditetapkan dari nilai atribut yang didefinisikan dalam prototype/ this._value = val; //}, // value: "hah", // bahkan jika nilai nilai ditulis secara manual, karena metode get mengembalikan this._value, nilai tidak dapat dibaca dengan benar: "hah" // selama mendapatkan pro yang tidak dapat dibaca. value () {// Nama metode sama dengan nama atribut. Atribut nilai dan atribut GET didefinisikan dalam prototipe. Kembalikan this._value;}}; var obj=new Foo("hello");//"hello" was not successfully written alert(obj.value);//undefined obj.value="yehoo";//only defined the get attribute, so it can only be read but not written, and the write is invalid alert(obj.value);//undefined alert(obj.value);//undefinedUntuk membuktikan bahwa contoh di atas dapat dibaca dan tidak dapat ditulis: Tulis _value secara manual: "hah", Anda dapat membaca nilainya tetapi tidak dapat menulisnya.
function foo (val) {this.value = val; // Hanya fitur GET nilai yang didefinisikan dalam prototipe, sehingga penulisan di sini tidak valid} foo.prototype = {// set value (val) {// Perhatikan bahwa nama metode dan nama atributnya sama, fitur yang ditetapkan dari nilai atribut yang didefinisikan dalam prototype/ this._value = val; //}, _ value: "hah", // bahkan jika nilai nilai ditulis secara manual, karena metode get mengembalikan this._value, nilai tidak dapat dibaca dengan benar: "hah" // selama mendapatkan pro () {} dan menetapkan pro () {atribut hah "tidak dapat dibaca dan ditulis, tetapi definisi yang salah, tetapi definisi yang salah, mereka dapat dibaca, tetapi fungsi yang salah. value () {// Nama metode sama dengan nama atribut. Atribut nilai dan atribut GET didefinisikan dalam prototipe. Kembalikan this._value;}}; var obj = foo baru ("halo"); // "halo" tidak berhasil ditulis peringatan (obj.value); // "hah" obj.value = "yehoo"; // hanya atribut get yang didefinisikan, jadi hanya dapat dibaca tetapi tidak ditulis, dan penulisannya tidak valid peringatan (obj.value);/"haH" "Jika nilainya: "hah" ditulis secara manual, dapatkah saya berusaha untuk membaca nilai nilainya? Karena this._value yang dikembalikan dengan metode GET tidak ditentukan, OBJ.Value membaca nilai nilai dan panggilan GET value () {} metode gagal, tetapi nilainya masih tidak dapat ditulis.
function foo (val) {this.value = val; // Hanya fitur GET nilai yang didefinisikan dalam prototipe, sehingga penulisan di sini tidak valid} foo.prototype = {// set value (val) {// Perhatikan bahwa nama metode dan atribut ini sama, fitur set dari nilai atribut yang didefinisikan dalam prototype/hah. Bahkan jika nilai nilai ditulis secara manual, karena metode GET mengembalikan this._value, nilai tidak dapat dibaca dengan benar: "hah" // selama get pro () {} dan set pro () {} atribut dinyatakan, mereka dapat membaca dan menulis, tetapi jika definisi fungsi salah, nilai properti yang benar tidak dapat diakses sebagaimana diperlukan. value () {// Nama metode dan nama atributnya sama. Atribut nilai dan fitur GET -nya didefinisikan dalam prototipe. Kembalikan this._value;}}; var obj=new Foo("hello");//"hello" was not written successfully alert(obj.value);//undefined read invalid because as long as obj.value, get returns this._value, and there is no value, so undefinedobj.value="yehoo";//only the get feature is defined, so it can only be read but not written, and the write invalid waspada (obj.value); // tidak ditentukanMelihat contoh ini, dapatkan set didefinisikan, tetapi mengembalikan ini._value yang tidak didefinisikan. Anda dapat menemukan bahwa nilainya dapat dibaca dan ditulis. Hapus metode Get Set dalam prototipe dan masih dapat dibaca atau ditulis
function foo (val) {this.value = val;} foo.prototype = {set value (val) {this._value = val;}, get value () {return this._value;}}; var obj = foo baru ("halo"); waspada (obj.value); // halo obj.value = "yehoo"; waspada (obj.value); // yehoo function foo (val) {this.value = val;} // Accing yang ditetapkan, ini tidak ada yang dikembalikan ke mana, itu tidak ada yang dikembalikan ke mana, itu tidak ada yang dikembalikan ke mana, itu tidak ada yang dikembalikan ke mana, itu tidak ada yang akan dikembalikan ke mana, itu tidak ada yang dikembalikan ke negara bagian yang tidak ada. Foo ("halo"); waspada (obj.value); // halo obj.value = "yehoo"; waspada (obj.value); // yehooMeringkaskan
Hanya atribut GET Pro () {} yang dapat dibaca dan tidak dapat ditulis;
Hanya mendeklarasikan atribut set Pro () {} agar dapat ditulis dan tidak dapat dibaca.
Jika tidak ada deklarasi yang dinyatakan, atributnya dapat dibaca dan dapat ditulis;
Jika semua deklarasi dibuat, baca dan tulis sesuai dengan metode yang ditentukan oleh Get Set;
Jika semua dinyatakan, tetapi metode baca dan tulis yang ditentukan tidak dapat dibaca dan ditulis dengan benar, dapatkan/set akan gagal. Menjadi default yang dapat dibaca dan ditulis
Atribut nilai yang ditentukan dalam prototipe mendefinisikan atribut GET. Anda masih dapat mengontrol bacaan dan menulis atribut nilai. Dengan kata lain, ketika OBJ.Value mengakses atribut, metode GET akan dipanggil, pertama pencarian di objek itu sendiri, dan kemudian mencari dalam prototipe. Jika tidak ada, itu akan dianggap tidak terdefinisi. Standarnya dapat dibaca dan dapat ditulis.
Mengisi kembali:
Apakah menggunakan get pro () {}/set pro () {} atau object.defineproperty (objek, pro, {get: function () {return this._name;}});Pro tidak dapat sama dengan pengembalian ini., Jika tidak, kesalahan berikut akan dilaporkan: (Saya tidak tahu mengapa, sepertinya overflow tumpukan yang disebabkan oleh panggilan saya sendiri)
Setelah koreksi master, saya mengerti mengapa kesalahan dilaporkan di sini: jika ini.value dikembalikan dalam metode GET () {}, metode nilai GET akan dipanggil lagi, sehingga jatuh ke dalam loop mati, menyebabkan stack metode meluap.