Klassen
Deze pagina is vertaald door PageTurner AI (beta). Niet officieel goedgekeurd door het project. Een fout gevonden? Probleem melden →
Eenvoudige objecten (zonder prototype), arrays, Maps en Sets worden altijd gedraft door Immer. Alle andere objecten moeten het immerable-symbool gebruiken om zichzelf als compatibel met Immer te markeren. Wanneer zo'n object wordt gemuteerd binnen een producer, blijft zijn prototype behouden tussen kopieën.
import {immerable} from "immer"
class Foo {
[immerable] = true // Option 1
constructor() {
this[immerable] = true // Option 2
}
}
Foo[immerable] = true // Option 3
Voorbeeld​
import {immerable, produce} from "immer"
class Clock {
[immerable] = true
constructor(hour, minute) {
this.hour = hour
this.minute = minute
}
get time() {
return `${this.hour}:${this.minute}`
}
tick() {
return produce(this, draft => {
draft.minute++
})
}
}
const clock1 = new Clock(12, 10)
const clock2 = clock1.tick()
console.log(clock1.time) // 12:10
console.log(clock2.time) // 12:11
console.log(clock2 instanceof Clock) // true
Gedetailleerde semantiek​
De semantiek voor het draften van klassen is als volgt:
Een draft van een klasse is een nieuw object met hetzelfde prototype als het originele object.
Bij het maken van een draft kopieert Immer alle eigen eigenschappen van de basis naar de draft. Dit omvat (in strikte modus) niet-enumereerbare en symbolische eigenschappen.
Eigen getters worden tijdens het kopieerproces aangeroepen, net zoals
Object.assignzou doen.Overgeërfde getters en methoden blijven ongewijzigd en worden geërfd door de draft, aangezien ze in het prototype zijn opgeslagen dat onaangeroerd blijft.
Immer roept geen constructorfuncties aan.
Het uiteindelijke exemplaar wordt geconstrueerd met hetzelfde mechanisme als de draft.
Alleen getters die ook een setter hebben, zijn beschrijfbaar in de draft, omdat de waarde anders niet teruggekopieerd kan worden.
Omdat Immer eigen getters van objecten omzet in normale eigenschappen, is het mogelijk objecten te gebruiken met getter/setter-traps in hun velden, zoals MobX en Vue doen.
Let op: standaard behandelt Immer niet-enumereerbare eigenschappen van objecten zoals getters/setters niet strikt vanwege prestatieoverwegingen. Voor strikte behandeling kun je useStrictShallowCopy(config) gebruiken. Gebruik true voor altijd strikt kopiëren, of "class_only" om alleen klasseninstanties strikt te kopiëren en snellere losse kopieën voor gewone objecten te gebruiken. Standaard is false. (Onthoud: ongeacht de strikte modus worden eigen getters/setters altijd by value gekopieerd. Er is momenteel geen configuratie om descriptoren ongewijzigd te kopiëren. Feature request/PR is welkom).
Immer ondersteunt geen exotische/engine-native objecten zoals DOM Nodes of Buffers. Subclassing van Map, Set of arrays wordt niet ondersteund en het immerable-symbool werkt niet hiervoor.
Wanneer je bijvoorbeeld met Date-objecten werkt, moet je dus altijd een nieuwe Date-instantie aanmaken in plaats van een bestaand Date-object te muteren.