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 namemező kezdeti értékét:

class User { constructor(name) { this.name = name; }}

User“s konstruktornak van egy paramétere name, amely a this.namemező 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:

  1. Mezőket a osztály például
  2. Mezőket az osztály maga (azaz statikus)

A mezők is 2 szint hozzáférhetőség:

  1. Nyilvános: a mező elérhető, bárhol
  2. 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 namemező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 Usertö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 #nameprivá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_INSTANCESbeá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:

  1. egy statikus módszer elérheti a statikus mezőket
  2. 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 Userszü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 Userszü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 aUserszü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.

writera ContentWriter gyermekosztály egy példánya. writer instanceof ContentWriter true.

ugyanakkor ContentWriterUser 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?