Javascript, osztályok

Általában az osztály példányai további inicializálást igényelnek, ezért általában definiál egy olyan függvény, amely új objektumokat hoz létre és inicializál. A következő példa bemutatja ezt a funkciót: meghatároz egy prototípus objektumot, amely egy értéktartományt képvisel, valamint egy "gyári" függvényt, amely létrehozza és inicializálja az osztály új példányait:

Ebben a példában számos érdekes pont van, amelyeket külön kiemelnünk kell. Ez meghatározza a gyári függvény tartományt (), amelyet új tartomány objektumok létrehozására használnak.

Vegye figyelembe, hogy a range () függvény határozza meg az egyes tartomány objektumok tulajdonságaitól és tulajdonságaitól. Ezek a nem megosztott, nem örökölt tulajdonságok egyedi információkat tartalmaznak minden egyes tartományra vonatkozóan. Végül vegye figyelembe, hogy a rangeObj által használt összes közös, öröklött módszer használja a tulajdonságokat és a tulajdonságokat, és hivatkozik rájuk a kulcsszó használatával, amely arra a tárgyra mutat, amelyre ezeket a módszereket hívják. Ennek a módszernek a használata bármely osztály bármelyik módozatának alapvető jellemzője.

konstruktőrök

Az építőket az új kulcsszó használatával hívják meg. Az új kulcsszó használata a konstruktor hívásához automatikusan új objektumot hoz létre, ezért a tervezőnek csak az új objektum tulajdonságait kell inicializálnia. A konstruktornak hívása fontos eleme a konstruktor prototípus tulajdonságának az új objektum prototípusaként való alkalmazása. Ez azt jelenti, hogy az azonos konstruktorral létrehozott objektumok ugyanazt a prototípus objektumot örökölik, és ennek megfelelően azonos osztályú tagok.

Az alábbi példa azt mutatja be, hogy miként hajthatja végre a korábban bemutatott Range osztályt, a gyári funkció használatát, de a konstruktor funkció használatával:

Ennek a két példának részletesen össze kell hasonlítania, és meg kell jegyeznem az osztályok meghatározásának e két módja közötti különbségeket. Először is, vegye figyelembe, hogy a konstruktornak történő konvertáláskor a gyár függvénytartományát () a tartományra () nevezték át. Ez a szokásos elrendezési konvenció: a konstruktorok bizonyos értelemben meghatározzák az osztályokat, és az osztálynevek nagybetűkkel kezdődnek. A rendes funkciók és módszerek nevei kisbetűs karakterekkel kezdődnek.

Ezután vegye figyelembe, hogy a Range () konstruktort a (a példa végén) új kulcsszóval hívják meg, míg a gyári függvénytartományt () nem hívják meg. Az első példában egy normál függvényt hívtak egy új objektum létrehozására, a második pedig a konstruktornak hívást használt. Mivel a Range () konstruktort az új kulcsszóval hívják, nem szükséges az örökölt () függvény hívása, vagy bármely más művelet végrehajtása új objektum létrehozásához. Egy új objektum automatikusan létrejön a konstruktor meghívása előtt, és ez elérhető a konstruktorban. A Range () konstruktornak csak inicializálnia kell.

A konstruktoroknak nem kell még egy újonnan létrehozott objektumot visszaadniuk. A konstruktorhívás kifejezés automatikusan létrehoz egy új objektumot, felhívja a konstruktort az objektum metódusaként, és visszaküldi az objektumot. Az a tény, hogy egy konstruktor hívása annyira különbözik a normál funkció hívásától, egy másik oka annak, hogy a tervezők általában olyan neveket kapnak, amelyek nagybetűvel kezdődnek. A konstruktorokat úgy tervezték, hogy konstruktorok formájában hívják őket, az új kulcsszóval, és általában rendes funkciókban hívják őket, mert nem tudják megfelelően elvégezni munkájukat. A tervezőknek szóló elnevezési konvenció, amely vizuális különbséget biztosít a konstruktorok neve és a rendes funkciók neve között, segít a programozóknak abban, hogy ne használják a kulcsszót.

Egy másik fontos különbség egy prototípus objektum elnevezése. Az első példában a prototípus egy gammaObj objektum volt. Ez egy kényelmes, leíró név volt, de nagyrészt önkényes. A második példában a prototípus a Range.prototype tulajdonság, és ez a név szükséges. A Range () konstruktorkivonat automatikusan használja a Range.prototype tulajdonságot az új tartományobjektum prototípusaként.

Végül, figyeljünk a példák azonos töredékére - mindkét osztályban a hatótávolság objektumainak metódusai azonosak és azonosak.

A konstruktor tulajdonsága

A második példában a Range.prototype tulajdonságot egy új objektummal látták el, amely az osztály módszereit tartalmazza. Bár célszerű volt meghatározni a módszereket egyetlen szó szerinti objektum tulajdonságaként, de nem volt szükség új objektum létrehozására.

Egy előre definiált prototípus objektum jelenléte a konstruktor tulajdonságával azt jelenti, hogy az objektumok általában örökölje a konstruktor tulajdonságát, ami a konstruktorokra vonatkozik. Mivel a konstruktorok az osztályazonosító szerepét játszzák, a konstruktor tulajdonság definiál egy objektumosztályt:

Ezeket a kapcsolatokat a konstruktor függvény, annak prototípusai, a prototípusról a konstruktorra mutató inverz hivatkozás és a konstruktor által létrehozott példák a következő ábra szemlélteti:

Javascript, osztályok

Fontos megjegyezni, hogy a Range () konstruktorát a diagram példájaként vettük fel. Valójában a Range osztja az előre meghatározott Range.prototype objektumot a sajátjával. És az új prototípus objektumnak nincs konstruktor tulajdonsága. Emiatt a Range osztály példái - amint azt a meghatározás is jelzi - nem rendelkeznek az építői tulajdonsággal. Ezt a problémát úgy oldhatja meg, hogy kifejezetten hozzáadja a konstruktort a prototípushoz:

Egy másik tipikus megoldás egy olyan előre definiált prototípus objektum használata, amely már rendelkezik a konstruktor tulajdonsággal, és hozzátette a következő módszereket:

Kapcsolódó cikkek