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, jaConstructor
viitata rakentaja funktio tai luokka, joka on luonut esimerkiksi.
- Instantiates uusi esiintymä objekti ja sitoo
this
sen sisällä rakentaja. - Yhdistää
instance.__proto__
jaConstructor.prototype
. - Kuten puoli-vaikutus 2, sitoo
instance.__proto__.constructor
jaConstructor
., - palauttaa
this
, joka viittaainstance
.
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 petollineninstanceof
. Sen sijaaninstanceof
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.