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

Jak zfreezowac const?

VPS Starter Arubacloud
0 głosów
301 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 (251,170 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 (599,730 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 177 wizyt
0 głosów
1 odpowiedź 220 wizyt
0 głosów
3 odpowiedzi 698 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...