A JavaScript prototípus öröklést használ: minden objektum örökli a tulajdonságait és módszereit a prototípus objektumából.
a hagyományos osztály, mint a Java vagy Swift nyelveken használt objektumok létrehozásának terve, nem létezik a JavaScriptben. A prototípus öröklés csak tárgyakkal foglalkozik.
a prototípus öröklés utánozhatja a klasszikus osztály örökségét. Ahhoz, hogy a hagyományos osztályok JavaScript, ES2015 szabvány bevezeti a class
szintaxis: a szintaktikai cukor felett prototípus öröklés.,
Ez a post megismerteti önt a JavaScript osztály: hogyan határozza meg egy osztály, inicializálja az esetben adjuk meg a mezők, módszerek, értem a privát, mind a nyilvános területeken felfogni a statikus mezők, módszerek.
1. Meghatározás: class kulcsszó
a speciális kulcsszó class
egy osztályt definiál a JavaScriptben:
a fenti kód egy osztályt definiál User
. A göndör zárójelek { }
határolják az osztálytestet. Vegye figyelembe, hogy ez a szintaxis neve class declaration.,
nem köteles megadni az osztály nevét. Egy osztály kifejezés használatával hozzárendelheti az osztályt egy változóhoz:
const UserClass = class { // The body of class};
könnyen exportálhat egy osztályt egy ES2015 modul részeként. Itt van az alapértelmezett export szintaxisa:
export default class User { // The body of class}
és egy megnevezett export:
export class User { // The body of class}
az osztály hasznos lesz az osztály példányának létrehozásakor. A példány az osztály által leírt adatokat és viselkedést tartalmazó objektum.,
The new
operator Instantiates the class in JavaScript: instance = new Class()
.
például a User
osztályt a new
operátor:
const myUser = new User();
new User()
new User()
a User
osztály példánya.
2. Inicializálás: konstruktor()
constructor(param1, param2, ...)
egy speciális módszer egy osztály testében, amely inicializálja a példányt., Ez az a hely, ahol beállítja a mezők kezdeti értékeit, vagy bármilyen objektumbeállítást végez.
a következő példában a konstruktor beállítja a name
mező kezdeti értékét:
class User { constructor(name) { this.name = name; }}
User
“s konstruktornak van egy paramétere name
, amely a this.name
mező kezdeti értékének beállítására szolgál.
a konstruktor belsejében this
érték megegyezik az újonnan létrehozott példánygal.,
az osztály példányosításához használt argumentumok a konstruktor paramétereivé válnak:
class User { constructor(name) { name; // => 'Jon Snow' this.name = name; }}const user = new User('Jon Snow');
name
a konstruktoron belüli paraméter értéke 'Jon Snow'
.
ha nem definiál egy konstruktort az osztályhoz, akkor egy alapértelmezett érték jön létre. Az alapértelmezett konstruktor egy üres függvény, amely nem módosítja a példányt.
ugyanakkor a JavaScript osztálynak legfeljebb egy konstruktora lehet.
3. A
Osztálymezők olyan változók, amelyek információkat tartalmaznak., Mezők is csatolni kell 2 személyek:
- Mezőket a osztály például
- Mezőket az osztály maga (azaz statikus)
A mezők is 2 szint hozzáférhetőség:
- Nyilvános: a mező elérhető, bárhol
- Magán lehetőséget: a mező elérhető, csak a testen belül az osztály
3.1 például Nyilvános területeken
nézzük meg még egyszer az előző kódrészletet:
class User { constructor(name) { this.name = name; }}
A kifejezés this.name = name
létrehoz egy példány mező name
állítani, hogy ez a kezdeti érték.,
később elérheti a name
mezőt egy property accessor használatával:
const user = new User('Jon Snow');user.name; // => 'Jon Snow'
name
egy nyilvános mező, mert a User
osztálytest.
amikor a mezők implicit módon jönnek létre a konstruktoron belül, mint az előző forgatókönyvben, nehéz lehet megragadni a mezők listáját. Meg kell megfejteni őket a konstruktor kódját.
jobb megközelítés az osztálymezők explicit deklarálása., Nem számít, mit csinál a kivitelező, a példány mindig ugyanazokkal a mezőkkel rendelkezik.
az osztály mezők javaslat lehetővé teszi, hogy meghatározza a mezők belsejében a test az osztály. Plusz, azonnal megadhatja a kezdeti értéket:
class SomeClass { field1; field2 = 'Initial value'; // ...}
módosítsuk a User
osztályt, és nyilvánítsunk egy nyilvános mezőt name
:
class User { name; constructor(name) { this.name = name; }}const user = new User('Jon Snow');user.name; // => 'Jon Snow'
name;
az osztály testén belül nyilvános mező name
.,
az így deklarált nyilvános mezők kifejezőek: a mezők gyors áttekintése elegendő az osztály adatstruktúrájának megértéséhez.
ezenkívül az osztály mező azonnal inicializálható a nyilatkozatban.
class User { name = 'Unknown'; constructor() { // No initialization }}const user = new User();user.name; // => 'Unknown'
name = 'Unknown'
az osztálytesten belül name
mezőt deklarál, és 'Unknown'
értékkel inicializálja.
nincs korlátozás a nyilvános mezők elérésére vagy frissítésére., Az értékeket a konstruktoron, a módszereken és az osztályon kívüli nyilvános mezőkhöz lehet olvasni és hozzárendelni.
3.2 privát példány mezők
a kapszulázás fontos fogalom, amely lehetővé teszi az osztály belső adatainak elrejtését. Valaki, aki kapszulázott osztályt használ, csak az osztály által biztosított nyilvános interfésztől függ, és nem párosul az osztály végrehajtási részleteivel.
A kapszulázással szem előtt tartott osztályokat könnyebb frissíteni, ha a megvalósítás részletei megváltoznak.,
egy objektum belső adatainak elrejtésének jó módja a privát mezők használata. Ezek azok a mezők, amelyek csak abban az osztályban olvashatók és módosíthatók, amelyhez tartoznak. Az osztály külvilága nem változtathatja meg közvetlenül a privát mezőket.
a privát mezők csak az osztály testén belül érhetők el.
előtag a mező nevét a speciális szimbólum #
, hogy ez privát, például #myField
., A #
előtagot minden alkalommal meg kell őrizni, amikor a mezővel dolgozik: deklarálja, olvassa el vagy módosítsa.
győződjünk meg róla, hogy a#name
mező egyszer beállítható a példány inicializálásakor:
#name
egy privát mező. A #name
a User
törzsén belül érhető el és módosítható. A getName()
módszer (a következő szakasz módszereiről bővebben) elérheti a #name
privát mezőt.,
de ha megpróbál hozzáférni a privát mező #name
kívül User
osztály test, szintaktikai hiba kerül dobásra: SyntaxError: Private field '#name' must be declared in an enclosing class
.
3.3 public static fields
az osztály mezőit is meghatározhatja: a statikus mezőket. Ezek hasznosak az osztályállandók meghatározásához vagy az osztályra vonatkozó információk tárolásához.
statikus mezők létrehozásához a JavaScript osztályban használja a static
speciális kulcsszót, amelyet a mező neve követ: static myStaticField
.,
adjunk hozzá egy új mezőt type
, amely jelzi a felhasználói típust: admin vagy regular. A statikus mezők TYPE_ADMIN
és TYPE_REGULAR
praktikus állandók a felhasználói típusok megkülönböztetéséhez:
static TYPE_ADMIN
és static TYPE_REGULAR
határozza meg a statikus változókat a User
osztály. A statikus mezők eléréséhez az osztályt kell használni, amelyet a mező neve követ: User.TYPE_ADMIN
és User.TYPE_REGULAR
.
3.,4 privát statikus mezők
néha még a statikus mezők is olyan végrehajtási részletek, amelyeket el szeretne rejteni. Ebben a tekintetben a statikus mezőket magántulajdonban lehet tartani.
ahhoz, hogy a statikus mező privát, előtag a mező neve #
speciális szimbólum: static #myPrivateStaticField
.
tegyük fel, hogy korlátozni szeretné a User
osztály példányainak számát., A példányok határértékeivel kapcsolatos részletek elrejtéséhez létrehozhat privát statikus mezőket:
a statikus mező User.#MAX_INSTANCES
beállítja az engedélyezett példányok maximális számát, míg a User.#instances
statikus mező számolja a példányok tényleges számát.
ezek a privát statikus mezők csak a User
osztályon belül érhetők el. A külső világból semmi sem zavarhatja a határok mechanizmusát: ez a kapszulázás előnye.
4. Módszerek
a mezők adatokat tárolnak., Az adatok módosításának képességét azonban az osztály részét képező speciális funkciók végzik: a módszerek.
a JavaScript osztályok támogatják mind a példány, mind a statikus módszereket.
4.1 Példánymódszerek
Példánymódszerek elérhetik és módosíthatják a példányadatokat. A példánymódszerek más példánymódszereket, valamint bármilyen statikus módszert hívhatnak.,
például definiáljunk egygetName()
módszert, amely aUser
osztály:
egy osztálymódszerben, valamint a konstruktorban adja vissza a nevet,this
érték megegyezik az osztálypéldánnyal. Use this
a példányadatok eléréséhez: this.field
, vagy akár más módszereket is hívhat: this.method()
.,
adjunk hozzá egy új módszert nameContains(str)
amely egy paraméterrel rendelkezik, és egy másik módszert hív fel:
nameContains(str) { ... }
a User
osztály, amely elfogad egy paramétert str
>. Több, mint, hogy végrehajtja egy másik módszer a példány this.getName()
, hogy a felhasználó nevét.
a módszer privát is lehet. Ahhoz, hogy a módszer privát előtag a nevét #
.
tegyükgetName()
method private:
#getName()
egy privát módszer., A módszer belsejében nameContains(str)
egy privát módszert hívsz így: this.#getName()
.
privát, #getName()
nem nevezhető a User
osztálytesten kívül.
4.2, akik véghez viszik, s alkotóinak
A getter, valamint szetter utánozzák rendszeres területen, de a több ellenőrzés, hogy a mező elérhető, illetve megváltozott.
a getter végrehajtásra kerül egy kísérlet, hogy a mező értéke, míg setter egy kísérletet, hogy egy értéket.,
annak biztosítása érdekében, hogy a name
tulajdonság a User
nem lehet üres, csomagoljuk be a privát mező #nameValue
egy getter és setter:
get name() {...}
>getter akkor kerül végrehajtásra, amikor a mező értékéhez fér hozzá: user.name
.
4.3 statikus módszerek
a statikus módszerek közvetlenül az osztályhoz csatlakoztatott funkciók. Az osztályhoz kapcsolódó logikát tartják, nem pedig az osztály példányához.,
statikus metódus létrehozásához használja a static
speciális kulcsszót, amelyet egy szokásos módszer szintaxis követ:static myStaticMethod() { ... }
.
statikus módszerekkel végzett munka során 2 egyszerű szabályt kell megjegyezni:
- egy statikus módszer elérheti a statikus mezőket
- egy statikus módszer nem fér hozzá a példánymezőkhöz.
például hozzunk létre egy statikus módszert, amely felismeri, hogy egy adott névvel rendelkező felhasználó már foglalt-e.,
isNameTaken()
egy statikus módszer, amely a statikus privát mezőt használja User.#takenNames
A felvett nevek ellenőrzéséhez.
5. Öröklés: kiterjeszti
az osztályok JavaScript támogatás egyetlen öröklés a extends
kulcsszó.
a class Child extends Parent { }
a Child
osztály örökli Parent
a konstruktort, mezőket és módszereket.
például hozzunk létre egy új ContentWriter
gyermekosztályt, amely kiterjeszti a User
szülőosztályt.,
ContentWriter
örökli a User
a kivitelező, a módszer getName()
és a mező name
. Szintén aContentWriter
osztály deklarál egy új mezőt posts
.
vegye figyelembe, hogy a szülői osztály privát tagjait nem a gyermekosztály örökölte.
5.1 Parent constructor: super() in constructor ()
Ha gyermekosztályban szeretné felhívni a szülő konstruktort, akkor a super()
speciális funkciót kell használnia a gyermek konstruktorban.,
például tegyük ContentWriter
konstruktor hívja a User
szülő konstruktorát, valamint inicializálja a hozzászólások mezőt:
super(name)
a gyermekosztályon belül ContentWriter
végrehajtja a User
szülőosztály konstruktorát.
vegye figyelembe, hogy a gyermek konstruktoron belül a super()
parancsot kell végrehajtania a this
kulcsszó használata előtt. A super()
hívás biztosítja, hogy a szülő konstruktor inicializálja a példányt.,
class Child extends Parent { constructor(value1, value2) { // Does not work! this.prop2 = value2; super(value1); }}
5.2 Szülőpéldány: super in methods
Ha szeretne hozzáférni a szülő módszer belsejében egy gyermek módszer, akkor a speciális parancsikon super
.
getName()
aContentWriter
asuper.getName()
módszert közvetlenül aUser
szülőosztályból használja.
Ez a funkció az úgynevezett módszer kényszerítő.
vegye figyelembe ,hogy asuper
statikus módszerekkel is elérheti a szülő statikus módszereit.
6., Object type checking: instanceof
object instanceof Class
is the operator that determines if object
is an instance of Class
.
Let’s see instanceof
operator in action:
user
is an instance of User
class, user instanceof User
evaluates to true
.
The empty object {}
is not an instance of User
, correspondingly obj instanceof User
is false
.,
instanceof
polimorf: az operátor a gyermeket a szülőosztály példányaként érzékeli.
writer
a ContentWriter
gyermekosztály egy példánya. writer instanceof ContentWriter
true
.
ugyanakkor ContentWriter
User
gyermekosztály. Így writer instanceof User
true
is.
mi van, ha meg szeretné határozni a példány pontos osztályát?, Használhatja aconstructor
tulajdonságot, és közvetlenül összehasonlíthatja a következő osztályokkal:
writer.constructor === ContentWriter; // => truewriter.constructor === User; // => false
7. Osztályok és prototípusok
azt kell mondanom, hogy a JavaScript osztályszintaxisa nagyszerű munkát végez a prototípus örökségből való kivonáshoz. A class
szintaxis leírásához még a prototípus kifejezést sem használtam.
de az osztályok a prototípus öröklés tetejére épülnek. Minden osztály függvény, és létrehoz egy példányt, amikor konstruktorként hivatkoznak rá.
a következő két kódrészlet egyenértékű.,
az osztály verziója:
a prototípus használatával:
az osztály szintaxisa sokkal könnyebb dolgozni, ha ismeri a Java vagy a Swift nyelvek klasszikus öröklési mechanizmusát.
egyébként, még akkor is, ha osztály szintaxist használ a JavaScriptben, azt javaslom, hogy jól értsd meg a prototípusos örökséget.
8. Class features availability
Az ebben a bejegyzésben bemutatott osztályfunkciók az ES2015-ben és a 3.szakaszban találhatók.,
a végén 2019, az osztály funkciók között oszlik meg:
- Nyilvános vagy privát például mezők része Osztály mezők javaslat
- Magán lehetőséget, például módszerek accessors része Osztály privát módszerek javaslat
- Nyilvános vagy privát statikus mezők, valamint saját statikus módszerek része Osztály statikus jellemzők javaslat
- A többi része ES2015 szabvány.
9. Következtetés
JavaScript osztályok inicializálják a példányokat a konstruktorokkal, definiálják a mezőket és a módszereket., A static
kulcsszó segítségével csatolhat mezőket és módszereket még az osztályra is.
az öröklés a extends
kulcsszó használatával érhető el: könnyen létrehozhat egy gyermekosztályt egy szülőtől. super
kulcsszó a szülői osztály eléréséhez használható egy gyermekosztályból.
a kapszulázás előnyeinek kihasználásához a mezőket és módszereket privátnak kell tekinteni az osztályok belső adatainak elrejtéséhez. A privát mezők és metódusok nevének a #
értékkel kell kezdődnie.,
A JavaScript osztályai egyre kényelmesebbé válnak.
mit gondol a #
használatáról a private properties előtagra?