Objektno orijentirani JavaScript (OOJS) 3 načina stvaranja primjeraka objekata
Kada je programski jezik sve o objektima, prva stvar koju moramo naučiti jest kako stvoriti objekte. Stvaranje objekata u JavaScriptu je prilično jednostavno: par kovrčavih proteza to će obaviti posao niti jedini način za stvaranje objekta niti jedini način koju ćete ikada trebati koristiti.
U JavaScriptu su instance objekta izrađene iz ugrađenih objekata i nastaju kada se program izvodi. Na primjer, Datum
je ugrađeni objekt koji nam daje informacije o datumima. Ako želimo prikazati trenutni datum na stranici, mi Potrebna je instanca izvođenja Datum
koja sadrži podatke o trenutnom datumu.
JavaScript nam također omogućuje definirati vlastite objekte koji mogu proizvesti vlastite instance objekta u runtime. U JavaScriptu, sve je objekt i svaki objekt ima konačni predak zvao Objekt
. Poziva se stvaranje instance objekta utjelovljenje.
1. novi
operater
Jedan od najčešćih i najpoznatijih metoda za stvaranje nove instance objekta je koristiti novi
operater.
Trebaš konstruktor napraviti novi
rad operatera. Konstruktor je metoda objekta koja spaja a nova instanca tog objekta. Njegova osnovna sintaksa izgleda ovako:
novi konstruktor ()
Konstruktor može prihvatite argumente koji se može koristiti za promjenu ili dodavanje svojstava objektnoj instanci koju konstruira. Konstruktor ima isto ime kao objekt kojem pripada.
Evo primjera kako stvoriti primjer Datum()
objekt s novi
ključne riječi:
dt = new Datum (2017, 0, 1) console.log (dt) // Sun Jan 01 2017 00:00:00 GMT + 0100
Datum()
je konstruktor za stvaranje novog Datum
objekt. Različiti konstruktori za objekt uzeti različite argumente stvoriti istu vrstu predmeta s objektom raznoliki atributi.
Nisu svi ugrađeni objekti u JavaScriptu slični Datum
. Postoje objekti koji nemojte dolaziti s konstruktorom: matematika
, JSON
i odraziti
, ali oni su još uvijek obični objekti.
Među ugrađenim objektima koji imaju konstruktore, Simbol
ne može se pozvati u stilu konstruktora instancirati novo Simbol
primjer. Može biti samo pozvan kao funkcija koji vraća novo Simbol
vrijednost.
Također, među ugrađenim objektima koji imaju konstruktore, ne moraju svi njihovi konstruktori biti pozvani sa novi
operatora kako bi se instalirao. Funkcija
, red
, greška
, i regularnim izrazom
također se mogu pozvati kao funkcije, bez korištenja novi
ključne riječi, a oni će instancirati i vratiti novu instancu objekta.
2. odraziti
objekt
Programeri iz pozadine možda već znaju API-ji za promišljanje. Refleksija je značajka programskih jezika pregledati i ažurirati neke od osnovnih entiteta, kao što su objekti i klase, tijekom izvođenja.
U JavaScriptu ste već mogli raditi neki operacije refleksije Objekt
. Ali, a odgovarajući API za refleksiju naposljetku su također postojali u JavaScriptu.
odraziti
objekt ima skup metoda za stvarati i ažurirati instance objekta. odraziti
objekt nema konstruktora, tako da ne može biti instancirana s novi
operator, i, baš kao matematika
i JSON
, to ne može se pozvati kao funkcija ili.
Međutim, odraziti
ima ekvivalent novi
operater: Reflect.construct ()
način.
Reflect.construct (cilj, argumentiList [, newTarget])
Oba cilj
i opcionalno NEWTARGET
argumenti predmeti koji imaju svoje konstruktore, dok argumentsList
je popis argumenata koji se prosljeđuje konstruktoru cilj
.
var dt = Reflect.construct (datum, [2017, 0, 1]); console.log (dt); // Sun Jan 01 2017 00:00:00 GMT + 0100
Gornji kod ima isti učinak kao instanciranje Datum()
koristiti novi
operater. Iako još uvijek možete koristiti novi
, Razmišljanje je ECMAScript 6 standard. Također vam omogućuje iskoristiti NEWTARGET
argument, što je još jedna prednost u odnosu na novi
operater.
Vrijednost NEWTARGET
's prototip (točnije, to je prototip. \ t NEWTARGET
Konstruktor korisnika postaje prototip novostvorene instance.
Prototip je svojstvo objekta, čija je vrijednost također objekt, nosi svojstva izvornog objekta. Ukratko, objekt dobiva svoje članove iz prototipa.
Ovdje ćemo vidjeti primjer:
klasa konstruktor () this.message = function () console.log ('poruka iz A') klasa B konstruktor () poruka () console.log ('poruka iz B') data () console.log ('podaci iz B') obj = Reflect.construct (A, [], B) console.log (obj.message ()); // poruka iz konzole.log (obj.data ()); // podaci iz B console.log (obj instanceof B) // true
Prolazom B
kao treći argument za Reflect.construct ()
, prototipnu vrijednost obj
objekt je biti isti kao prototip B
konstruktor (koji ima svojstva. \ t poruka
i podaci
).
Tako, obj
može pristupiti poruka
i podaci
, dostupan u prototipu. Ali od tada obj
koristi se , ona također ima svoju
poruka
to primljeno od .
Čak iako obj
konstruiran je kao niz, to jest ne na primjer red
, jer je njegov prototip postavljen na Objekt
.
obj = Reflect.construct (Niz, [1,2,3], Objekt) console.log (obj) // Array [1, 2, 3] console.log (obj instanceof Array)
Reflect.construct ()
može biti korisno kada želite stvoriti objekt s više od jednog nacrta.
3. Object.create ()
način
Također možete stvoriti novi obični objekt s određenim prototipom preko Object.create ()
. To se također može činiti vrlo sličnim korištenju novi
operater, ali nije.
Object.create (O [, svojstvaObjekt])
O
argument je objekt koji služi prototipu za novi objekt koji će biti izrađen. Opcionalno propertiesObject
argument je popis svojstava možda želite dodati novom objektu.
klasa konstruktor () poruka () console.log ('poruka od A') var obj = Object.create (novo A (), data: pisano: true, podesivo: true, value: function () return 'data from obj') console.log (obj.message ()) // poruka iz A console.log (obj.data ()) // podaci iz obj obj1 = Object.create ( new A (), foo: writable: true, podesivo: true, value: function () return 'foo iz obj1') console.log (obj1.message ()) // poruka iz A konzole. log (obj1.foo ()) // foo iz obj1
U obj
objekt, dodano svojstvo podaci
, dok u obj1
, to je foo
. Dakle, kao što vidite, možemo imati svojstva i metode dodane novom objektu.
Ovo je sjajno kada želite stvoriti više objekata iste vrste ali s različita dodatna svojstva ili metode. Object.create ()
sintaksa štedi nevolje kodiranja svih njih zasebno.