JavaScript Academy · Oppitunti

Tehdasfunktiot

Luokaa objekteja, joiden yksityinen tila toteutetaan sulkeumilla.

Oppitunti 4/413 vaihetta

Tehdasfunktiot on ilmainen JavaScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu JavaScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on tehdasfunktio

Tehdasfunktio on funktio, joka palauttaa uuden olion. Konstruktorista poiketen sitä kutsutaan normaalisti ilman new-avainsanaa, ja se voi käyttää sulkeumia yksityiseen tilaan.

function createUser(name) {
  return {
    name,
    greet: () => "Hi, I am " + name
  };
}
const u = createUser("Ada");
console.log(u.greet()); // "Hi, I am Ada"

Ilman new-avainsanaa

Tehdasfunktiot välttävät new-avainsanan ja this-kontekstin sudenkuopat. Funktiota kutsutaan yksinkertaisesti, ja tuloksena saadaan olio.

function point(x, y) {
  return { x, y };
}
const p = point(3, 4);
console.log(p.x, p.y); // 3 4

Yksityinen tila sulkeuman avulla

Tehdasfunktiossa määritellyt muuttujat ovat yksityisiä. Palautetun olion metodit muodostavat niihin sulkeuman samalla tavoin kuin moduulikuviossa, mutta näin voidaan luoda useita instansseja.

function createCounter() {
  let count = 0; // private
  return {
    inc: () => ++count,
    get: () => count
  };
}
const c = createCounter();
c.inc();
console.log(c.get()); // 1

Useita toisistaan riippumattomia instansseja

Tehdasfunktion jokainen kutsu tuottaa uuden olion, jolla on oma yksityinen tilansa. Tämä on keskeinen ero singleton-moduuliin verrattuna.

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());          // 1

Lasketut ominaisuudet

Tehdasfunktiot voivat johtaa arvoja luonnin yhteydessä ja tarjota laskettuja metodeja pitäen syötearvot yksityisinä.

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()); // 14

Oletusasetukset ja valinnaiset asetukset

Koska tehdasfunktiot ovat tavallisia funktioita, oletusarvot ja valinnaiset asetukset voidaan käsitellä helposti destrukturoinnin avulla.

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 }

Koostaminen perinnän sijaan

Tehdasfunktioissa suositaan koostamista: olio rakennetaan yhdistelemällä toiminnallisuuksia luokkaketjun laajentamisen sijaan.

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"

Jaettu toiminnallisuus

Jos haluatte jakaa metodit instanssien kesken ilman instanssikohtaisia kopioita, määritelkää ne kerran ja sijoittakaa ne instansseille. Voitte myös hyväksyä sulkeumien yksityisyydestä maksaman pienen kustannuksen.

const behavior = {
  describe() { return "id " + this.id; }
};
function createItem(id) {
  return Object.assign({ id }, behavior);
}
console.log(createItem(7).describe()); // "id 7"

Myös funktioiden palauttaminen

Tehdasfunktio voi palauttaa olion sijaan funktion, jos se muodostaa selkeämmän rajapinnan, ja säilyttää silti yksityisen tilan sulkeuman avulla.

function multiplier(factor) {
  return (n) => n * factor;
}
const triple = multiplier(3);
console.log(triple(5)); // 15

Tehdasfunktio ja konstruktori

Konstruktorit käyttävät new-avainsanaa, this-kontekstia ja prototyyppiketjua. Tehdasfunktiot ovat yksinkertaisempia, välttävät this-kontekstin virheet ja tarjoavat sulkeumien avulla todellisen yksityisyyden, mutta metodit eivät tällöin jakaudu prototyypin kautta.

Kelpoisuuden tarkistaminen luonnin yhteydessä

Tehdasfunktiot voivat tarkistaa syötteet ja joko heittää poikkeuksen tai normalisoida arvot ennen palauttamista. Näin jokainen tuotettu olio on varmasti kelvollinen.

function createAge(value) {
  if (value < 0) throw new Error("age must be >= 0");
  return { value };
}
console.log(createAge(30).value); // 30

Pikatesti

Tehdasfunktiot.

Kertaus

Tehdasfunktiot palauttavat olioita ilman new-avainsanaa tai this-kontekstia ja käyttävät sulkeumia yksityiseen tilaan. Jokainen kutsu tuottaa toisistaan riippumattoman instanssin, mikä mahdollistaa lasketut ominaisuudet, oletusasetukset, koostamisen ja kelpoisuuden tarkistamisen. Tehdasfunktiot vaihtavat prototyyppien kautta jaettavat metodit yksinkertaisuuteen ja todelliseen yksityisyyteen, joten ne ovat selkeä sulkeumiin perustuva vaihtoehto konstruktoreille.

Aloita maksutta

Opi JavaScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
59
Oppitunnit
200

Usein kysytyt kysymykset

Onko oppitunti ”Tehdasfunktiot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa JavaScript Academy-oppimispolun 3 oppituntia, myös oppitunnin “Tehdasfunktiot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tehdasfunktiot”?

Luokaa objekteja, joiden yksityinen tila toteutetaan sulkeumilla. Harjoittelet JavaScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni JavaScript Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin JavaScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Tehdasfunktiot”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä JavaScript Academy-oppitunnilla?

Kyllä. Jokainen JavaScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Miten sulkeumat kaappaavat tilan
  2. Yksityiset muuttujat sulkeumilla
  3. Moduulimalli (IIFE)
  4. Tehdasfunktiot
← Takaisin: JavaScript Academy