• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zfreezowac const?

Object Storage Arubacloud
0 głosów
346 wizyt
pytanie zadane 5 września 2022 w JavaScript przez Renzov Obywatel (1,220 p.)

Hejka,

Kazano mi zfreezowac pewną zmienną, ale nie mam pojęcia jak to zrobic. Probowalem na rozne sposoby, ale nie dziala. Dostalem informacje "Combine as const with object freeze"

Tak wyglada moj kod:
 

const env = {
    ///
} as const

I nie mam pojecia gdzie dac te object freeze. Czy mam zrobic nastepujaco:

env = Object.freeze(env) ?

 

Probowalem na rozne sposoby i nic nie dziala :/

komentarz 5 września 2022 przez VBService Ekspert (253,420 p.)
edycja 5 września 2022 przez VBService

FYI, przykład, różnica między const Object.freeze

console.warn('const value1');
const value1 = 1;

try {
  value1 = 2;
} catch (err) {
  console.log(err.message); // "Assignment to constant variable."
}

console.warn('object1');
const object1 = {
  prop1: 1,
  prop2: 2
};

console.log('prop1', object1.prop1, 'prop2', object1.prop2); // 1 2

object1.prop1 = 3; // Prezd Object.freeze
console.log('prop1', object1.prop1, 'prop2', object1.prop2); // 3 2

Object.freeze(object1);

object1.prop1 = 5; // Po Object.freeze
console.log('prop1', object1.prop1, 'prop2', object1.prop2); // 3 2

try {
  object1 = { prop3: 3 };
} catch (err) {
  console.log('object1', err.message); // "Assignment to constant variable."
}

console.warn('object2');
const object2 = object1;
console.log(object2 == object1, typeof object1, typeof object2);

object1.prop1 = 5;
object2.prop1 = 5;
console.log('object1.prop1', object1.prop1, 'object2.prop1', object2.prop1); // 3 3

try {
  object2 = { prop3: 3 };
} catch (err) {
  console.log('object2', err.message); // "Assignment to constant variable."
}

console.warn('object3');
const object3 = Object.freeze({
  prop1: 1,
  prop2: { 
    name: 'name', 
    value: 'value'
  }
});

object3.prop1 = 3;
console.log('prop1', object3.prop1); // 1

object3.prop2.name = 'name2';
console.log('prop2', object3.prop2); // name2
console.log('prop2', object3.prop2.name); // name2

object3.prop2.value = 'value2';
console.log('prop2', object3.prop2); // value2
console.log('prop2', object3.prop2.value); // value2

try {
  object3 = { prop3: 3 };
} catch (err) {
  console.log('object3', err.message); // "Assignment to constant variable."
}

 

1 odpowiedź

+4 głosów
odpowiedź 5 września 2022 przez ScriptyChris Mędrzec (190,190 p.)

Składnia as const pochodzi z TypeScript i jej efekt jest tylko do momentu kompilacji - więc w runtime wartość nadal jest mutowalna. Object.freeze mrozi zmienną w runtime, ale jeśli dany obiekt (w tym tablica) posiada zagnieżdżone propertisy, to one już nie są mrożone - w takim przypadku trzeba wywołać Object.freeze rekurencyjnie.

komentarz 5 września 2022 przez Renzov Obywatel (1,220 p.)
Dziekuje za opdpowiedz. Jak wywolac freeze rekurencyjny?

Dalem na koncu pod as const

Object.freeze(env), ale przypuszczam, ze to nie tak powinno byc
komentarz 5 września 2022 przez ScriptyChris Mędrzec (190,190 p.)

W wyżej podlinkowanej dokumentacji jest przykład rekurencyjnej funkcji deepFreeze, która mrozi zagnieżdżone propertisy.

2
komentarz 5 września 2022 przez rafal.budzis Szeryf (85,260 p.)

Można też skorzystać z Proxy jeśli chcemy robić coś bardziej zaawansowanego.  

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Mozna na przykład rzucić jakiś błąd jeśli ktoś będzie chciał nadpisać wartość. 

1
komentarz 5 września 2022 przez Comandeer Guru (601,590 p.)

Jak już chcemy iść w proxy, to raczej po prostu bym sięgnął po rozwiązania typu Immutable.js. Proxy nie słyną z tego, że są przyjazne w użyciu.

Podobne pytania

+1 głos
0 odpowiedzi 195 wizyt
0 głosów
1 odpowiedź 243 wizyt
0 głosów
3 odpowiedzi 711 wizyt

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...