Factory-funktioner
Skapa objekt med privat tillstånd via closures.
Factory-funktioner är en gratis lektion i JavaScript Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för JavaScript Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i JavaScript Academy innehåller totalt 4 lektioner.
Vad är en factory-funktion?
En factory function är en funktion som returnerar ett nytt objekt. Till skillnad från en konstruktor anropar du den normalt, utan new, och den kan använda closures för privat tillstånd.
function createUser(name) {
return {
name,
greet: () => "Hi, I am " + name
};
}
const u = createUser("Ada");
console.log(u.greet()); // "Hi, I am Ada"Inget new-nyckelord
Factory-funktioner undviker fallgroparna med new och this. Du anropar helt enkelt funktionen och får tillbaka ett objekt.
function point(x, y) {
return { x, y };
}
const p = point(3, 4);
console.log(p.x, p.y); // 3 4Privat tillstånd via en closure
Variabler som deklareras i factory-funktionen är privata. Det returnerade objektets metoder sluter sig kring dem, precis som i modulmönstret, men här skapas många instanser.
function createCounter() {
let count = 0; // private
return {
inc: () => ++count,
get: () => count
};
}
const c = createCounter();
c.inc();
console.log(c.get()); // 1Många oberoende instanser
Varje anrop av factory-funktionen skapar ett nytt objekt med ett eget privat tillstånd. Det är den viktigaste skillnaden mot 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()); // 1Beräknade egenskaper
Factory-funktioner kan beräkna värden när objektet skapas och exponera beräknade metoder, samtidigt som indata hålls privata.
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()); // 14Standardkonfiguration och valfria alternativ
Eftersom de är vanliga funktioner hanterar factory-funktioner standardvärden och alternativ på ett smidigt sätt 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 }Komposition framför arv
Factory-funktioner föredrar komposition: bygg ett objekt genom att blanda in beteenden i stället för att utöka en klasskedja.
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"Delat beteende
Om du vill dela metoder mellan instanser utan kopior per instans kan du definiera dem en gång och tilldela dem. Du kan också acceptera den lilla kostnaden för den integritetsfördel som closures ger.
const behavior = {
describe() { return "id " + this.id; }
};
function createItem(id) {
return Object.assign({ id }, behavior);
}
console.log(createItem(7).describe()); // "id 7"Returnera även funktioner
En factory-funktion kan returnera en funktion i stället för ett objekt när det ger ett renare gränssnitt, samtidigt som den fortfarande fångar privat tillstånd.
function multiplier(factor) {
return (n) => n * factor;
}
const triple = multiplier(3);
console.log(triple(5)); // 15Factory-funktion kontra konstruktor
Konstruktorer använder new, this och prototypkedjan. Factory-funktioner är enklare, undviker buggar med this och ger verklig integritet via closures, men metoderna delas inte via en prototyp.
Validering vid skapandet
Factory-funktioner kan validera indata och kasta ett undantag eller normalisera den innan de returnerar, vilket garanterar att varje skapat objekt är giltigt.
function createAge(value) {
if (value < 0) throw new Error("age must be >= 0");
return { value };
}
console.log(createAge(30).value); // 30Snabb kontroll
Factory-funktioner.
Sammanfattning
Factory-funktioner returnerar objekt utan new eller this och använder closures för privat tillstånd. Varje anrop ger en självständig instans och stöder beräknade egenskaper, standardkonfiguration, komposition och validering. De byter delning av prototypmetoder mot enkelhet och verklig integritet, vilket gör dem till ett tydligt, closure-baserat alternativ till konstruktorer.
Lär dig JavaScript med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 59
- Lektioner
- 200
Vanliga frågor
Är lektionen ”Factory-funktioner” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen JavaScript Academy, inklusive ”Factory-funktioner”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i JavaScript Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Factory-funktioner”?
Skapa objekt med privat tillstånd via closures. Ni övar på JavaScript Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig JavaScript Academy?
Du behöver inga förkunskaper. Utbildningen i JavaScript Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Factory-funktioner”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här JavaScript Academy-lektionen?
Ja. Varje JavaScript Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.