Welcome to Our Website

JavaScript Tehtaan Toimintoja vs Rakentaja Toimintoja vs-Luokat

Ennen ES6, siellä oli paljon epäselvyyttä erot tehtaan toimintaa ja rakentaja toiminto JavaScript. Koska ES6: lla on ”luokan” avainsana, monet ihmiset näyttävät ajattelevan, että se ratkaisi monia ongelmia rakentajan toimintojen kanssa. Tutkitaan suuria eroja, joista sinun pitää olla tietoinen.,

Ensimmäinen, katsotaanpa esimerkkejä kustakin:

Jokainen näistä strategioita myymälöissä menetelmät on jaettu prototyyppi, ja mahdollisesti tukee yksityistä dataa rakentaja toiminto sulkemiset. Toisin sanoen niillä on enimmäkseen samat ominaisuudet, ja niitä voitiin käyttää lähinnä vaihdellen.

Javascriptissä mikä tahansa funktio voi palauttaa uuden objektin. Kun se ei ole rakentajafunktio tai luokka, sitä kutsutaan tehdastoiminnoksi.,

ES6 luokat desugar trojan toimintoja, joten kaikki, joka seuraa siitä, rakentaja toimintoja koskee myös ES6 luokat:

class Foo {}console.log(typeof Foo); // function

Rakentajien pakottaa soittajat käyttää new avainsana. Tehtaat eivät tee niin, mutta sillä on merkittäviä sivuvaikutuksia.

joten mitä tekee new keyword do?,

Huomautus: käytämme instance viittaamaan luotuun instanssiin, ja Constructor viitata rakentaja funktio tai luokka, joka on luonut esimerkiksi.

  1. Instantiates uusi esiintymä objekti ja sitoo this sen sisällä rakentaja.
  2. Yhdistää instance.__proto__ ja Constructor.prototype.
  3. Kuten puoli-vaikutus 2, sitoo instance.__proto__.constructor ja Constructor.,
  4. palauttaa this, joka viittaa instance.

Edut Rakentajien & `luokka`

  • Eniten kirjoja opettaa sinulle, käyttää luokan tai rakentajat.
  • this viittaa uuden objektin.
  • jotkut pitävät tavasta myFoo = new Foo() lukee.
  • mikro-optimoinnista voi olla hyötyä, mutta siitä ei kannata olla huolissaan, ellet ole profiloinut koodiasi ja todistanut, että se on sinulle ongelma.,

Haittoja Rakentajien & `luokka`

Ennen ES6, unohtamatta new oli hyvin yleinen vika. Sen torjumiseksi, monet ihmiset käyttää boilerplate valvoa sitä:

function Foo() {
if (!(this instanceof Foo)) { return new Foo(); }
}

ES6+ (ES2015) jos yrität soittaa luokan konstruktori ilman new, se on aina heittää virheen. Se ei ole mahdollista välttää pakottaa new vaatimus soittajat ilman kääre luokan tehtaassa toiminto.,

tiedot instantiaatiosta vuotavat kutsumusliittymään (”uuden” vaatimuksen kautta).

kaikki soittajat ovat tiukasti kytkettyinä rakentajan toteutukseen. Jos tarvitset lisää joustavuutta tehdas, refactor on breaking muutos. Luokan tehdas refactors ovat yleisiä tarpeeksi, että ne näkyvät uraauurtava Refaktorointi kirja, ”Refaktorointi: Parantaminen Suunnittelu Olemassa olevaa Koodia” Martin Fowler, Kent Beck, John Brant, William Opdyke, ja Don Roberts.,

Rakentajien murtaa Auki / Suljettu-Periaate

Koska new vaatimus, rakentaja toiminnot rikkovat avoin/suljettu-periaate: API pitäisi olla auki tiedostotunnistetta, mutta suljettu muutos.

väitän, että luokan tehdas refactor on niin yleinen, että sitä olisi pidettävä standardin laajennus kaikille rakentajille: Päivittäminen luokan tehdas ei pitäisi rikkoa asioita, mutta JavaScript, se ei.,

Jos aloitat vientiä rakentaja tai luokan ja käyttäjät alkavat käyttää rakentaja, sitten tiellä huomaat, että tarvitset joustavuutta tehdas, (esimerkiksi, voit siirtyä täytäntöönpanoon käyttää object-altaat, tai instanssia koko suorituksen yhteyksissä, tai on enemmän perintö joustavuutta käyttämällä vaihtoehtoisia prototyyppejä), et voi helposti tehdä ilman pakottaa refactor on soittajille.,

Valitettavasti, JavaScript, siirtyminen rakentaja tai luokan tehdas on breaking muuta:

yllä olevassa esimerkissä, me aloittaa kanssa luokassa, mutta haluamme lisätä kyky tarjota erilaisia auton nippuja. Tätä varten tehdas käyttää vaihtoehtoisia prototyyppejä eri autokimpuille. Olen käyttänyt tätä tekniikkaa tallentaa erilaisia toteutuksia media player käyttöliittymä, poiminta oikea prototyyppi, joka perustuu tyypin media player tarvitaan valvontaa.,

Käyttämällä Rakentajien Avulla Petollinen `instanceof`

Yksi breaking muutokset rakentaja tehdas refactor on instanceof. Joskus ihmisiä houkuttaa käyttää instanceof tyyppitarkistussuojana koodissaan. Se voi olla hyvin ongelmallista. Suosittelen välttämään instanceof.

`instanceof` piilee.,

instanceof ei tee tyyppi tarkkailun siten, että voit odottaa samanlaisia tarkastuksia tehdä vahvasti kirjoitettu kielillä. Sen sijaan se ei henkilöllisyys tarkistaa vertaamalla kohteen __proto__ vastustaa Constructor.prototype omaisuutta.

Se ei toimi eri muistin maailmoissa, kuten iframe, esimerkiksi (yhteinen lähde bugeja 3. osapuolen JavaScript upottaa). Se myös toimi, jos Constructor.prototype saa vaihtaa.,

Se epäonnistuu myös silloin, jos aloitat luokan tai rakentaja (joka palauttaa this liittyvät Constructor.prototype), ja vaihtaa sitten vientiä mielivaltainen esine (ei liity Constructor.prototype), joka on mitä tapahtuu, kun vaihdat rakentaja tehdas.

lyhyesti instanceof on toinen tapa, jolla siirtyminen rakentaja tehdas on breaking muutos.

luokan

  • käytön hyödyt kätevä, itsenäinen syntaksi.,
  • yksi kanoninen tapa jäljitellä luokkia Javascriptissä. Ennen ES6: ta suosituissa kirjastoissa oli useita kilpailevia toteutuksia.
  • tutummin luokkakieliseltä taustaltaan.

Haittoja Käyttämällä class

Kaikki rakentaja haittoja, plus:

  • Houkutus käyttäjät voivat luoda ongelmallista luokan hierarkioita käyttämällä extends avainsana.,

Luokka hierarkiat johtaa joukko tunnettuja ongelmia olio-suunnittelu, mukaan lukien fragile base class ongelma, gorilla banaani ongelma, päällekkäisyyttä välttämättömyys ongelma, ja niin edelleen. Valitettavasti, luokka tarjoaa ulottuu kuin pallot varaa heittää ja tuolit varaa istua. Lue lisää ”JavaScriptin kaksi pilaria: Prototypal OO”ja” Inside the Dev Team Death Spiral”.,

Se on syytä huomata, että sekä rakentajien ja tehtaita voidaan käyttää myös luoda ongelmallista, perintö hierarkiat, mutta `laajentaa` avainsana, luokka luo affordance, joka johtaa väärälle tielle. Toisin sanoen, se kannustaa sinua ajatella joustamaton (ja usein väärin) on-suhteita, eikä joustavampi koostumusta on-tai ei voi-tehdä suhteita.

On affordance on ominaisuus, joka tarjoaa mahdollisuuden suorittaa tiettyjä toimia., Esimerkiksi nuppi tarjoaa kiertämällä, vipu tarjoaa vetämällä, nappia painamalla tarjoaa, jne…

Etuja Käyttämällä Tehtaita

Tehtaat ovat paljon joustavampia kuin joko rakentaja funktiot tai luokat, ja he eivät osaa johtaa ihmisiä väärälle tielle houkuttelemalla niitä `laajentaa` avainsanan ja syvä perintö hierarkiat. On monia turvallisempaa koodin uudelleenkäyttö mekanismeja, sinun pitäisi suosia yli luokan perintö, mukaan lukien toiminnot ja moduulit.,

Paluu mielivaltainen esine ja käyttää mielivaltaisen prototyyppi

esimerkiksi, voit helposti luoda erilaisia esineitä, joilla pannaan täytäntöön sama API, esim media player, joka voi instantiate pelaajille useita erilaisia video sisältöä, joka käyttää eri APIs konepellin alle, tai tapahtuma kirjasto, joka voi lähettää DOM tapahtumia tai web socket tapahtumia.

Tehtaat voivat myös instanssia esineiden koko suorituksen yhteyksissä, hyödyntää kohde-altaat ja sallia joustavampi prototypal perintö malleja.,

Ei refaktorointi huolestuttaa

Et koskaan on tarve muuntaa tehdas rakentaja, joten refaktorointi koskaan olla ongelma.

Ei ole `uusi`

Ei ole epäselvyyttä käyttäen new. Älä. (se saa this käyttäytymään huonosti, katso seuraava kohta).

Standard ”tämä” käyttäytyminen

this käyttäytyy kuin se normaalisti olisi, jotta voit käyttää parent-objekti. Esimerkiksi sisälle player.create(), this viittaa pelaaja, aivan kuten mikä tahansa muu menetelmä vetoaminen olisi., call() ja apply() myös siirtää this odotetusti.

Jotkut ihmiset kuin tapa `myFoo = createFoo()` lukee

  • Ei luoda linkki esimerkiksi Factory.prototype — mutta tämä on oikeastaan hyvä asia, koska et saa petollinen instanceof. Sen sijaan instanceof epäonnistuu aina. Katso hyödyt.
  • this ei katso uusi objekti tehtaassa. Katso hyödyt.,
  • se saattaa toimia mikro-optimoinnin vertailuarvoissa rakentajafunktiota hitaammin. Hidas polku on edelleen erittäin nopea — miljoonia ops/sec vanhalla tietokoneella. Tämä koskee todennäköisemmin kirjasto-tai kehyskoodia kuin sovelluskoodia. Aina benchmark käyttäjänäkökulmasta ennen micro-optimointeja.

Johtopäätös

mielestäni class voi olla kätevä syntaksin, mutta se voi tehdä jopa siitä, että se houkuttelee varomattomia käyttäjiä kaatuu kallioilla luokan perintö., Se on myös riskialtista, koska tulevaisuudessa, haluat ehkä päivittää tehdas, mutta kaikki soittajat on tiukasti kytketty rakentaja toimintoa, koska new avainsana ja se, että siirtyminen luokat tehtaita on breaking muutos.

saatat ajatella, että voit vain refactor puhelun sivustoja, mutta suuria joukkueita, tai jos luokka olet työskennellyt on osa julkista API, voit murtaa koodin, joka ei ole omassa hallinnassa. Toisin sanoen, et voi aina olettaa, että refaktorointi soittajat on edes vaihtoehto.,

cool juttu tehtaita on, että he eivät ole vain tehokkaampia ja joustavampia, ne ovat myös helpoin tapa kannustaa koko joukkuetta, ja koko API käyttäjän emäkset käyttää malleja, jotka ovat yksinkertainen, joustava ja turvallinen.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *