Factory-funksjoner
Opprett objekter med privat tilstand via closures.
Factory-funksjoner er en gratis leksjon i JavaScript Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i JavaScript Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i JavaScript Academy inneholder totalt 4 leksjoner.
Hva er en fabrikkfunksjon
En fabrikkfunksjon er en funksjon som returnerer et nytt objekt. I motsetning til en konstruktør kaller du den på vanlig måte, uten new, og den kan bruke closures for privat tilstand.
function createUser(name) {
return {
name,
greet: () => "Hi, I am " + name
};
}
const u = createUser("Ada");
console.log(u.greet()); // "Hi, I am Ada"Ingen new-nøkkelord
Fabrikkfunksjoner unngår fallgruvene ved new og this. Du kaller ganske enkelt funksjonen og får et objekt tilbake.
function point(x, y) {
return { x, y };
}
const p = point(3, 4);
console.log(p.x, p.y); // 3 4Privat tilstand via closure
Variabler som deklareres i fabrikkfunksjonen, er private. Metodene på det returnerte objektet danner closures over dem, akkurat som i modulmønsteret, men her produseres det mange instanser.
function createCounter() {
let count = 0; // private
return {
inc: () => ++count,
get: () => count
};
}
const c = createCounter();
c.inc();
console.log(c.get()); // 1Mange uavhengige instanser
Hvert kall til fabrikkfunksjonen produserer et nytt objekt med sin egen private tilstand. Dette er den viktigste forskjellen fra en singleton-modul.
function createCounter() {
let n = 0;
return { inc: () => ++n };
}
const a = createCounter();
const b = createCounter();
console.log(a.inc(), a.inc()); // 1 2
console.log(b.inc()); // 1Beregnede egenskaper
Fabrikkfunksjoner kan utlede verdier når objektet opprettes og eksponere beregnede metoder, samtidig som inndataene holdes private.
function rectangle(w, h) {
return {
area: () => w * h,
perimeter: () => 2 * (w + h)
};
}
const r = rectangle(3, 4);
console.log(r.area()); // 12
console.log(r.perimeter()); // 14Standardverdier og valgfri konfigurasjon
Fordi de er vanlige funksjoner, håndterer fabrikkfunksjoner standardverdier og alternativer på en ryddig måte med destrukturering.
function createButton({ label = "OK", disabled = false } = {}) {
return { label, disabled };
}
console.log(createButton()); // { label: "OK", disabled: false }
console.log(createButton({ label: "Go" })); // { label: "Go", disabled: false }Komposisjon fremfor arv
Fabrikkfunksjoner favoriserer komposisjon: Bygg et objekt ved å blande inn atferd i stedet for å utvide en klassekjede.
const canFly = (s) => ({ fly: () => s.name + " flies" });
function createBird(name) {
const self = { name };
return Object.assign(self, canFly(self));
}
console.log(createBird("Robin").fly()); // "Robin flies"Delt atferd
For å dele metoder mellom instanser uten kopier per instans kan du definere dem én gang og tilordne dem. Alternativt kan du godta den lille kostnaden for den private tilgangen closures gir.
const behavior = {
describe() { return "id " + this.id; }
};
function createItem(id) {
return Object.assign({ id }, behavior);
}
console.log(createItem(7).describe()); // "id 7"Returnere funksjoner også
En fabrikkfunksjon kan returnere en funksjon i stedet for et objekt når det gir et renere grensesnitt, samtidig som privat tilstand fortsatt fanges opp.
function multiplier(factor) {
return (n) => n * factor;
}
const triple = multiplier(3);
console.log(triple(5)); // 15Fabrikkfunksjon kontra konstruktør
Konstruktører bruker new, this og prototypekjeden. Fabrikkfunksjoner er enklere, unngår feil med this og gir reell privat tilgang gjennom closures, men deler ikke metoder via en prototype.
Validering ved opprettelse
Fabrikkfunksjoner kan validere inndata og kaste en feil eller normalisere verdier før de returnerer, slik at hvert produserte objekt garantert er gyldig.
function createAge(value) {
if (value < 0) throw new Error("age must be >= 0");
return { value };
}
console.log(createAge(30).value); // 30Hurtigsjekk
Fabrikkfunksjoner.
Oppsummering
Fabrikkfunksjoner returnerer objekter uten new eller this og bruker closures for privat tilstand. Hvert kall gir en uavhengig instans og støtter beregnede egenskaper, standardkonfigurasjon, komposisjon og validering. De gir avkall på deling av prototypemetoder til fordel for enkelhet og reell privat tilgang, og er dermed et ryddig, closure-basert alternativ til konstruktører.
Lær deg JavaScript med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 59
- Leksjoner
- 200
Ofte stilte spørsmål
Er leksjonen «Factory-funksjoner» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien JavaScript Academy, inkludert «Factory-funksjoner», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i JavaScript Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Factory-funksjoner»?
Opprett objekter med privat tilstand via closures. Du øver på JavaScript Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med JavaScript Academy?
Ingen tidligere erfaring er nødvendig. JavaScript Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Factory-funksjoner»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne JavaScript Academy-leksjonen?
Ja. Alle JavaScript Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hvordan closures fanger tilstand
- Private variabler med closures
- Modulmønsteret (IIFE)
- Factory-funksjoner