Cara deep freeze objek di javascript

Saat bekerja dengan nilai dan objek dalam JavaScript, terkadang Anda mungkin perlu membatasi apa yang dapat dilakukan dengannya untuk mencegah perubahan pada objek konfigurasi di seluruh aplikasi, objek keadaan, atau konstanta global

Show

Fungsi dengan akses ke data tersebut dapat memodifikasinya secara langsung padahal seharusnya tidak (dan ini juga dapat berasal dari kesalahan yang tidak disengaja yang dibuat oleh pengembang). Selain itu, pengembang lain yang mengerjakan basis kode yang sama (atau menggunakan kode Anda) mungkin membuat perubahan tersebut secara tidak terduga

Syukurlah JavaScript menyediakan beberapa konstruksi untuk menangani situasi semacam ini

Dalam tutorial ini, kita akan membahas konsep kekekalan dan metode objek

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6 dan
const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
7 dalam JavaScript. Kita akan melihat cara kerjanya menggunakan contoh kode ilustratif dan mendiskusikan kemungkinan batasan kinerja. Sekarang, mari kita mulai

Memahami kekekalan dalam JavaScript

Singkatnya, membuat objek tidak berubah berarti bahwa perubahan lebih lanjut tidak akan berlaku. Pada dasarnya, statusnya menjadi hanya-baca. Sampai batas tertentu, inilah yang dicapai oleh kata kunci

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
8

const jarOfWine = "full";

// throws error "Uncaught TypeError: Assignment to constant variable."
jarOfWine = "empty";

Namun tentu saja, kita tidak dapat menggunakan

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
8 untuk entitas seperti objek dan larik karena cara kerja deklarasi
const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
8 — ini hanya membuat referensi ke suatu nilai. Untuk menjelaskan ini, mari tinjau tipe data JavaScript

Primitif vs. objek

Kumpulan tipe data pertama adalah nilai yang hanya terdiri dari satu item. Ini termasuk primitif seperti string atau angka yang tidak dapat diubah

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_

Saat kami menyalin tipe primitif ini, kami menyalin nilai

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'

Kedua variabel,

const guest = user;
1 dan
const guest = user;
2, sekarang berisi dua string terpisah, dan Anda dapat mengubah salah satunya secara terpisah dari yang lain. Namun, objek berperilaku berbeda

Saat Anda mendeklarasikan objek, seperti pada kode berikut, variabel

const guest = user;
3 tidak berisi objek itu sendiri, tetapi referensi untuk itu

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}

Ini seperti menuliskan alamat gua yang berisi tumpukan emas Anda. Alamatnya bukan gua. Jadi, saat kami mencoba menyalin objek menggunakan metode penetapan yang sama seperti saat kami menyalin string, kami akhirnya hanya menyalin referensi atau alamat dan kami tidak memiliki dua objek terpisah

const guest = user;
_

Memodifikasi

const guest = user;
_3 juga mengubah
const guest = user;
5

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}

Anda biasanya dapat menguji ini dengan metode

const guest = user;
6 atau operator persamaan ketat

Object.is(user, guest) // returns true

user === guest // returns true

Ini permainan serupa dengan kata kunci

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
8. Itu membuat referensi ke suatu nilai, yang berarti bahwa meskipun pengikatan tidak dapat berubah (yaitu, Anda tidak dapat menugaskan kembali variabel), nilai yang dirujuk dapat berubah

Ini terjadi ketika kami berhasil memodifikasi properti

const guest = user;
8 sebelumnya, meskipun
const guest = user;
5 dideklarasikan dengan
const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
8
<

guest.name = "John";

Dengan kata lain, apa yang diberikan

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_8 kepada kita adalah ketetapan penugasan, bukan nilai ketetapan

Membatasi perubahan pada properti objek dan seluruh objek

Karena objek dalam JavaScript disalin dengan referensi, selalu ada risiko bahwa referensi yang disalin mengubah objek aslinya. Bergantung pada kasus penggunaan Anda, perilaku seperti itu mungkin tidak diinginkan. Dalam hal ini, mungkin masuk akal untuk "mengunci" objek

(Idealnya, Anda akan membuat salinan objek Anda dan memodifikasinya, bukan objek aslinya. Meskipun sebagian besar mekanisme penyalinan atau kloning dangkal, jika Anda bekerja dengan objek bersarang dalam, Anda pasti menginginkan kloning dalam. )

JavaScript menyediakan tiga metode yang melakukan berbagai tingkat pembatasan akses ke objek. Ini termasuk

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
2,
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
3, dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
4. Meskipun kami akan membahas yang terakhir, kami akan fokus pada dua yang pertama


Cara deep freeze objek di javascript
Cara deep freeze objek di javascript

Lebih dari 200 ribu pengembang menggunakan LogRocket untuk menciptakan pengalaman digital yang lebih baik

Cara deep freeze objek di javascript
Cara deep freeze objek di javascript
Pelajari lebih lanjut →


guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
5 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6 bendera properti

Namun, sebelum kita melanjutkan, mari telusuri beberapa konsep dasar di balik mekanisme yang membatasi akses ke properti. Secara khusus, kami tertarik pada bendera properti, seperti

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
5 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6

Anda biasanya dapat memeriksa nilai flag ini saat menggunakan metode

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
9 atau
Object.is(user, guest) // returns true

user === guest // returns true
0

const hunanProvince = {
  typeOfWine: "Emperor's Smile",
};

Object.getOwnPropertyDescriptors(hunanProvince);

// returns
{
  typeOfWine: {
    value: "Emperor's Smile",
    writable: true,
    enumerable: true,
    configurable: true
  },
}

Meskipun kita biasanya lebih mementingkan nilai sebenarnya dari properti kita saat bekerja dengan objek JavaScript, properti memiliki atribut lain selain atribut

Object.is(user, guest) // returns true

user === guest // returns true
1 , yang menyimpan nilai properti

Ini termasuk atribut

Object.is(user, guest) // returns true

user === guest // returns true
_1,
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
5, dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6 yang telah disebutkan, serta
Object.is(user, guest) // returns true

user === guest // returns true
5, seperti yang terlihat di atas

Bendera

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
5 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6 adalah yang paling penting bagi kami. Ketika
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_5 diatur ke
Object.is(user, guest) // returns true

user === guest // returns true
9 untuk properti, nilainya dapat berubah. Jika tidak, itu hanya bisa dibaca

Lalu ada

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_6, yang bila disetel ke
Object.is(user, guest) // returns true

user === guest // returns true
9 pada properti, memungkinkan Anda membuat perubahan pada tanda yang disebutkan di atas atau menghapus properti

Jika

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_6 malah disetel ke
guest.name = "John";
3, semuanya pada dasarnya menjadi hanya-baca dengan satu pengecualian. jika
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_5 diatur ke
Object.is(user, guest) // returns true

user === guest // returns true
9 di mana
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6 adalah
guest.name = "John";
3, nilai properti masih dapat berubah

Object.defineProperty(hunanProvince, "capital", {
  value: "Caiyi Town",
  writable: true,
});

hunanProvince.capital = "Possibly Gusu";

Object.getOwnPropertyDescriptors(hunanProvince);
// now returns
{
  typeOfWine: {
    value: "Emperor's Smile",
    writable: true,
    enumerable: true,
    configurable: true
  },
  capital: {
    value: "Possibly Gusu",
    writable: true,
    enumerable :false,
    configurable: false
  },
}

Perhatikan bahwa

Object.is(user, guest) // returns true

user === guest // returns true
5 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6 keduanya
guest.name = "John";
3 untuk properti
const hunanProvince = {
  typeOfWine: "Emperor's Smile",
};

Object.getOwnPropertyDescriptors(hunanProvince);

// returns
{
  typeOfWine: {
    value: "Emperor's Smile",
    writable: true,
    enumerable: true,
    configurable: true
  },
}
1 di sini karena dibuat dengan
const hunanProvince = {
  typeOfWine: "Emperor's Smile",
};

Object.getOwnPropertyDescriptors(hunanProvince);

// returns
{
  typeOfWine: {
    value: "Emperor's Smile",
    writable: true,
    enumerable: true,
    configurable: true
  },
}
2. Seperti disebutkan sebelumnya, properti yang dibuat dengan cara ini memiliki semua flag yang disetel ke
guest.name = "John";
3. Namun
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_5 adalah
Object.is(user, guest) // returns true

user === guest // returns true
9 karena kami menetapkannya secara eksplisit

Kami juga diizinkan untuk mengubah

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_5 dari
Object.is(user, guest) // returns true

user === guest // returns true
9 menjadi
guest.name = "John";
3, tetapi hanya itu. Anda tidak dapat mengubahnya dari
guest.name = "John";
_3 menjadi
Object.is(user, guest) // returns true

user === guest // returns true
9. Nyatanya, setelah
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_6 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
5 disetel ke
guest.name = "John";
3 untuk properti, tidak ada perubahan lebih lanjut yang diizinkan

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_0

Sementara bendera ini digunakan di sini pada tingkat properti, metode seperti

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
2 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
3 bekerja pada tingkat objek. Mari kita beralih ke itu sekarang

Artikel ini menganggap Anda memiliki pengetahuan umum tentang mengapa konsep kekekalan berguna

Namun, jika Anda ingin menggali lebih dalam dan membaca beberapa argumen yang mendukung dan menentangnya, inilah panduan yang sangat berguna (dengan tautan ke sumber daya tambahan) yang membahas topik tersebut. Itu

Menggunakan const user = { name: "Jane", surname: "Traveller", stayDuration: "3 weeks", roomAssigned: 1022, } _4 vs. const user = { name: "Jane", surname: "Traveller", stayDuration: "3 weeks", roomAssigned: 1022, } 5 untuk kekekalan objek

Sekarang, mari kita lihat metode

Object.defineProperty(hunanProvince, "capital", {
  value: "Caiyi Town",
  writable: true,
});

hunanProvince.capital = "Possibly Gusu";

Object.getOwnPropertyDescriptors(hunanProvince);
// now returns
{
  typeOfWine: {
    value: "Emperor's Smile",
    writable: true,
    enumerable: true,
    configurable: true
  },
  capital: {
    value: "Possibly Gusu",
    writable: true,
    enumerable :false,
    configurable: false
  },
}
8 dan
Object.defineProperty(hunanProvince, "capital", {
  value: "Caiyi Town",
  writable: true,
});

hunanProvince.capital = "Possibly Gusu";

Object.getOwnPropertyDescriptors(hunanProvince);
// now returns
{
  typeOfWine: {
    value: "Emperor's Smile",
    writable: true,
    enumerable: true,
    configurable: true
  },
  capital: {
    value: "Possibly Gusu",
    writable: true,
    enumerable :false,
    configurable: false
  },
}
9


Lebih banyak artikel bagus dari LogRocket

  • Jangan lewatkan momen dengan The Replay, buletin yang dikurasi dari LogRocket
  • Pelajari bagaimana Galileo dari LogRocket mengatasi kebisingan untuk secara proaktif menyelesaikan masalah di aplikasi Anda
  • Gunakan useEffect React untuk mengoptimalkan kinerja aplikasi Anda
  • Beralih di antara beberapa versi Node
  • Temukan cara menganimasikan aplikasi React Anda dengan AnimXYZ
  • Jelajahi Tauri, kerangka kerja baru untuk membangun binari
  • Bandingkan NestJS vs. Cepat. js

Menggunakan const user = { name: "Jane", surname: "Traveller", stayDuration: "3 weeks", roomAssigned: 1022, } _4

Saat kami membekukan objek menggunakan

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_4, itu tidak dapat lagi dimodifikasi. Pada dasarnya, properti baru tidak dapat lagi ditambahkan dan properti yang sudah ada tidak dapat dihapus. Seperti yang bisa Anda tebak, ini dicapai dengan menyetel semua tanda ke
guest.name = "John";
3 untuk semua properti

Mari kita telusuri sebuah contoh. Inilah dua objek yang akan kita kerjakan

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_1

Sekarang, mari ubah properti di objek pertama,

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
03

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_2

Jadi, objek aslinya sekarang terlihat seperti ini

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_3

Tentu saja, ini adalah perilaku yang diharapkan. Objek dapat diubah secara default. Sekarang, mari kita coba membekukan sebuah objek. Kami akan bekerja dengan

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_04 karena belum diubah

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_4

Untuk menguji apakah suatu objek dibekukan, JavaScript menyediakan metode

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
05

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_5

Sekarang, meskipun kami mencoba memodifikasinya seperti berikut, tidak ada efeknya

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_6

Namun, seperti yang akan segera kita lihat, kita akan mengalami masalah saat mulai menggunakan objek bersarang. Seperti kloning objek, pembekuan juga bisa dangkal atau dalam

Mari buat objek baru dari

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
03 dan
let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
04 dan susun array di dalamnya

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_7

Anda akan melihat bahwa meskipun kita membekukannya, kita masih bisa membuat perubahan pada array di objek bersarang

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_8

Array bilangan genap sekarang memiliki elemen pertamanya yang dimodifikasi dari

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
08 menjadi
let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
09. Karena array juga merupakan objek, perilaku ini juga muncul di sini

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_9

Jika Anda telah menguji kode Anda di konsol browser, kemungkinan besar kode tersebut gagal secara diam-diam dan tidak menimbulkan kesalahan apa pun. Jika Anda ingin kesalahan menjadi lebih eksplisit, coba gabungkan kode Anda dalam Ekspresi Fungsi yang Segera Dipanggil (IIFE) dan aktifkan mode

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
10

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
0

Kode di atas sekarang harus membuang

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_11 di konsol

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
1

Sekarang, bagaimana kita membuat seluruh objek kita, termasuk top-level (referensi properti langsung) dan properti bersarang, dibekukan?

Seperti yang telah kita catat, pembekuan hanya diterapkan pada properti level teratas dalam objek, jadi

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
12  adalah yang kita inginkan

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
2

Sekarang, upaya untuk mengubah properti bersarang tidak berhasil

Perhatikan bahwa sementara membekukan pada dasarnya menjaga terhadap perubahan objek, itu memungkinkan penugasan ulang variabel

Menggunakan guest.name = "John"; // now both user and guest look like this: { name: "John", surname: "Traveller", stayDuration: "3 weeks", roomAssigned: 1022, } _3

Dengan

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_2, perubahan baru tidak berpengaruh pada objek yang dibekukan. Namun, metode
const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_7 memungkinkan untuk memodifikasi properti yang ada. Artinya, meskipun Anda tidak dapat menambahkan properti baru atau menghapus properti yang sudah ada, Anda dapat membuat perubahan

Metode

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
7 pada dasarnya menyetel bendera
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
6 yang telah kita bahas sebelumnya menjadi
guest.name = "John";
3, dengan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
5 disetel ke
Object.is(user, guest) // returns true

user === guest // returns true
9 untuk setiap properti

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
3

Berikut contoh lain dengan array

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
4

Penyegelan juga mencegah pendefinisian ulang properti dengan menggunakan

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
21 atau
let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
22, apakah Anda menambahkan properti baru atau memodifikasi properti yang sudah ada

Ingat, bagaimanapun, bahwa jika

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_5 adalah
Object.is(user, guest) // returns true

user === guest // returns true
9, Anda masih dapat mengubahnya menjadi
guest.name = "John";
3, tetapi ini tidak dapat diurungkan

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
5

Penyegelan perubahan lain yang tidak mungkin dilakukan adalah mengubah properti data normal menjadi pengakses (yaitu, pengambil dan penyetel)

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
6

Kebalikannya juga demikian. Anda tidak dapat mengubah pengakses menjadi properti data. Sama seperti pembekuan, penyegelan objek mencegah prototipenya berubah

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
7

Sekali lagi, seperti pembekuan, perilaku default di sini adalah penyegelan dangkal. Jadi, Anda dapat memilih untuk menyegel objek dengan cara yang sama seperti Anda dapat membekukannya

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
_8

Kami telah memodifikasi fungsi

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_26 MDN di sini untuk melakukan penyegelan

const jarOfWine = "full";

const emptyJar = jarOfWine; // both jars are now 'full'
_9

Sekarang, objek bersarang kita juga disegel

Menggunakan guest.name = "John"; // now both user and guest look like this: { name: "John", surname: "Traveller", stayDuration: "3 weeks", roomAssigned: 1022, } _4

Metode JavaScript lain yang secara khusus dapat mencegah penambahan properti baru adalah metode

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
28

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
0

Karena yang kami lakukan hanyalah mencegah penambahan properti baru, properti yang sudah ada jelas dapat dimodifikasi dan bahkan dihapus

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_1

Sesuatu yang perlu diperhatikan adalah bahwa properti

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_29 menjadi tidak dapat diubah

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_2

Untuk menguji apakah suatu objek dapat diperluas, cukup gunakan metode

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
30

const user = {
  name: "Jane",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_3

Sama seperti saat kita secara manual menyetel

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_6 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
5 flag ke
guest.name = "John";
3 untuk properti, membuat objek tidak dapat diperpanjang adalah jalan satu arah

const user = { name: "Jane", surname: "Traveller", stayDuration: "3 weeks", roomAssigned: 1022, } 4 dan const user = { name: "Jane", surname: "Traveller", stayDuration: "3 weeks", roomAssigned: 1022, } 5 kasus penggunaan dan masalah kinerja

Singkatnya,

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
2 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
3adalah konstruksi yang disediakan oleh bahasa JavaScript untuk membantu mempertahankan berbagai tingkat integritas objek. Namun, bisa sangat membingungkan untuk memahami kapan seseorang perlu menggunakan metode ini

Salah satu contoh yang disebutkan sebelumnya adalah penggunaan objek global untuk manajemen status aplikasi. Anda mungkin ingin membuat objek asli tetap tidak berubah dan membuat perubahan pada salinan, terutama jika Anda ingin melacak perubahan status dan mengembalikannya

Pembekuan bertahan terhadap kode yang mencoba mengubah objek yang seharusnya tidak dimodifikasi secara langsung

Objek yang dibekukan atau disegel juga dapat mencegah penambahan properti baru yang diperkenalkan karena salah ketik, seperti nama properti yang salah ketik

Metode ini juga membantu saat melakukan debug karena pembatasan yang ditempatkan pada objek dapat membantu mempersempit kemungkinan sumber bug

Yang mengatakan, itu bisa menjadi sumber sakit kepala bagi siapa saja yang menggunakan kode Anda karena pada dasarnya tidak ada perbedaan fisik antara objek beku dan non-beku

Satu-satunya cara untuk mengetahui dengan pasti bahwa suatu benda dibekukan atau disegel adalah dengan menggunakan metode ________6______38 atau

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
39. Ini bisa membuat agak sulit untuk bernalar tentang perilaku objek yang diharapkan karena mungkin tidak sepenuhnya jelas mengapa pembatasan semacam itu diberlakukan

adalah salah satu fitur yang

let nextGame = "Word Duel";

// change to "Word Dual"? Doesn't stick.
nextGame[7] = “a”;

nextGame; // still "Word Duel"

// Of course, if we'd declared nextGame with `const`, then we couldn't reassign it.
nextGame = "Word Dual";

nextGame; // now "Word Dual"
_40 ; . Yang pertama menggunakan literal templat yang diberi tag untuk membuat komponen yang diberi gaya

Jika Anda bertanya-tanya apa - jika ada - biaya kinerja yang ada saat menggunakan salah satu metode yang dibahas di atas, ada beberapa masalah kinerja historis di mesin V8. Namun, ini lebih merupakan bug daripada yang lainnya, dan memang begitu

Antara 2013 dan 2014,

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
2 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
3 juga mengalami beberapa peningkatan kinerja di V8

Ini antara 2015 dan 2019. Ini menunjukkan bahwa kinerja dalam kedua kasus hampir sama di Chrome

Tetap saja, penyegelan atau pembekuan dapat memengaruhi kecepatan enumerasi objek di browser tertentu seperti Safari

Pustaka pihak ketiga untuk menangani kekekalan

Ada beberapa cara untuk menangani kekekalan dalam JavaScript. Meskipun metode yang dibahas di atas dapat berguna untuk dimiliki, kemungkinan besar Anda akan menggunakan perpustakaan untuk aplikasi substansial apa pun

Contohnya termasuk Immer dan Immutable. js. Dengan Immer, Anda menggunakan tipe data JavaScript yang sudah Anda ketahui. Namun, meskipun tidak berubah. js memperkenalkan struktur data baru, ini bisa menjadi opsi yang lebih cepat

Kesimpulan

JavaScript menyediakan metode seperti

guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
_2 dan
guest.name = "John";

// now both user and guest look like this:
{
  name: "John",
  surname: "Traveller",
  stayDuration: "3 weeks",
  roomAssigned: 1022,
}
3 untuk berbagai tingkat pembatasan akses untuk objek

Namun, seperti kloning, karena objek disalin dengan referensi, pembekuan biasanya dangkal. Oleh karena itu, Anda dapat mengimplementasikan fungsi deep freeze atau deep seal dasar Anda sendiri atau, bergantung pada kasus penggunaan Anda, manfaatkan pustaka seperti Immer atau Immutable. js

LogRocket. Debug kesalahan JavaScript lebih mudah dengan memahami konteksnya

Kode debug selalu merupakan tugas yang membosankan. Tetapi semakin Anda memahami kesalahan Anda, semakin mudah untuk memperbaikinya

LogRocket memungkinkan Anda memahami kesalahan ini dengan cara baru dan unik. Solusi pemantauan frontend kami melacak keterlibatan pengguna dengan frontend JavaScript Anda untuk memberi Anda kemampuan untuk mengetahui dengan tepat apa yang dilakukan pengguna yang menyebabkan kesalahan

Cara deep freeze objek di javascript
Cara deep freeze objek di javascript

LogRocket merekam log konsol, waktu muat halaman, jejak tumpukan, permintaan/respons jaringan yang lambat dengan header + badan, metadata browser, dan log khusus. Memahami dampak kode JavaScript Anda tidak akan pernah semudah ini

Bagaimana cara membekukan objek dalam JavaScript?

membekukan() Objek. freeze() metode statis membekukan objek. Membekukan objek mencegah ekstensi dan membuat properti yang ada tidak dapat ditulisi dan tidak dapat dikonfigurasi.

Bagaimana cara membekukan objek bersarang di JavaScript?

Jika Anda perlu membekukan objek bersarang dan membuatnya tidak dapat diubah, Anda harus mengikuti pendekatan rekursi untuk membekukan level demi level . Catatan. Obyek. metode freeze() juga dapat digunakan untuk membuat array tidak berubah.

Apa perbedaan antara pembekuan objek dan pembekuan dalam?

Perbedaan antara pembekuan dangkal dan pembekuan dalam adalah bahwa pembekuan dangkal tidak berurusan dengan objek/array bersarang . Di sisi lain, pendekatan deep freeze dapat digunakan untuk membekukan objek sepenuhnya termasuk objek/array bersarang.

Apa perbedaan antara pembekuan objek () vs const?

const mencegah penugasan ulang. Objek. freeze() mencegah perubahan .