Uvod

Object() je funkcija koja se može smatrati “majkom” svih objekata. Svi objekti u JavaScriptu su nastali od ove funkcije. Kreiranje objekata je moguće na više načina ali naredni način najbolje objašnjava vezu izmedju konstruktorske funkcije i objekta:

Konstruktorska funkcija ima brojne metode i dva svojstva: “Object.length” (veoma čudno svojstvo koje uvek vraća 1) i “Object.prototype”

OBJAŠNJENJE:
Funkcije u javascriptu su “First class citizen”, stoga podržavaju sve operacije dostupne drugim tipovima. Izmedju ostalih tipova funkcije podržavaju i karakteristike objekata, pa stoga funkcije kao i objekti imaju svoja svojstva i metode. Jedno od najbitnijih karakteristika konstruktorske funkcije je svojstvo Object.prototype, preko koga konstruktorska funkcija prosledjuje osnovna svojstva i metede svim objektima u JavaScript-u.

“Object.prototype” svojstvo konstruktorske f-ije

funkcija objekt

“Object.prototype” nema neko “pametno” ime, već generičko, nastalo na osnovu pripadnosti funkciji (svojstvo konstruktorske funkcije Object()). Ovo svojstvo konstruktorske funkcije (tipa “objekat”) je zaduženo da prosledjuje metode i svojstva svim novo generisanim objektima. Ovaj objekat delegira sva svoja svojstva i metode novo kreiranim objektima, pa su im tako dostupna od samoga starta. Object.prototype se nalazi na kraju lanca nasledjivanja i sva svojstva i metode koje poseduje su dostupne svakome objektu javascripta.

  • SVOJSTVA:
    1. .constructor
    2. __proto__
  • METODE:
    1. hasOwnProperty()
    2. isPrototypeOf()
    3. propertyIsEnumerable()
    4. toString()
    5. valueOf()

Svojstva ovog objekta su specifična jer njihovi deskriptori svojstva imaju negativne vrednosti (writable=no; enumerable=no; configurable=no), a pošto svojojstva nisu enumerable, to znači da nisu dostupna kroz “for…in” loop. Karakteristike svojstava ovoga objekta su sledeće:

Property attributes of Object.prototype
Writable no
Enumerable no
Configurable no

Ova svojstva i metode “Object.prototype delegira i objektima koji nastaju nasledjivanjem tj. svim objektima duž lanca nasledjivanja. Object.prototype se uvek nalazi na kraju prototipskog lanca nasledjivanja.

Svojstva “Object.prototype” objekta

Object.prototype.constructor

Ovo svojstvo ukazuje na konstruktorsku funkciju od koje je nastao prvobitni objekat, a ukoliko objekat nema svoju “ličnu” konstruktorsku funkciju (npr. objekt literal {}, nastao korišćenjem ključne reči new…), onda javascript engine svojstvo .constructor traži duž lanca nasledjivanja sve dok je ne nadje.

Object.prototype.__proto__

Ovo svojstvo (tzv. “dunder proto”, skraćeno od “double underscore proto”) ukazuje na roditeljski objekat od koga naš objekat nasledjuje svojstva i metode. Sa ovim svojstvom možemo čak i da predefinišemo objekat od koga želimo da nasledjujemo, mada generalno trebamo izbegavati korišćenje ovog svojstva, jer je veoma sporo, a pored toga nije po ES standardu iako je prihvaćeno u svim browserima (izuzev IE<11). Ukoliko baš želimo da koristimo ovako svojstvo, bolje je da koristimo svojstvo getPrototypeOf() koje je prihvaćeno ES2015 standardom, a ima iste karakteristike kao __proto__.

Ovo svojstvo može da se koristi i ulančano, pa tako može da se dodje do bilo kog prototype objekta duž celog lanca nasledjivanja:

Koristeći ovo nestandardizovano svojstvo možemo da od drugog objekta napravimo naš prototype objekat, tako što mu jednostavno dodelimo drugi objekat.

Primer

Metode Object.prototype objekta

Object.prototype.isPrototypeOf()

Ova metoda proverava da li objekat postoji u nečijem lancu nasledjivanja.

Object.prototype.hasOwnProperty()

Metodom “hasOwnPropery()” se ispituje da li odredjeni objekat (bez objekata u protoytpe lancu) ima neko svojstvo, vraća boolean vrednost. Ovo svojstvo će da proveri čak i non-enumerable lična svojstva objekta.

NAPOMENA:
Pored prethodnog načina često se može videti sledeći pristupi ovom problemu:

a) Operator “in”

Za ispitivanje svih objekta u prototype lancu se koristi operator in. Sa ovim operatorom se ispituje da li sam objekat ima neko svojstvo, ali se takodje proveravaju i svi objekti koji delegiraju svojstva u prototype lancu.

b) operator !==

Ovaj način vraća isti rezultat kao operator “in” (sva svojstva u prototype lancu”), medjutim ovakav pristup se ne preporučuje jer najsporiji.

Object.prototype.propertyIsEnumerable()

Metodom “propertyIsEnumerable()” ispituje da li je deskriptor svojstva enumerable setovano na vrednost true, tj da li je svojstvo iterativno i vidljivo kroz iteracije svojstava.

Primer

Object.prototype.toString()

Ova metoda vraća string reprezentaciju objekta.

Updating Native Objects Prototypes

Pošto su i nativni objekti (String, Array, Number…) takodje objekti, onda se i na njih može primeniti mehanizam delegiranog nasledjivanja, pa čak i dodavanje novih svojstava početnom prototype objektu:

Sada možemo da koristimo metodu trim() na svim stringovima:

Mana ovog pristupa je ta što novije verzije JavaScript-a mogu imati novu funkcionalnost pod baš tim nazivom “trim” pa bi naša metoda pregazila standardizovanu metodu. Ovaj problem bi mogao da se reši na sledeći način:

Metode konstruktorske funkcije

Object.create()

Sa metodom Object.create() se generiše objekat kome se odmah pri kreiranju definiše od kog objekta mu se delegiraju metode preko “prototype lanca” (ne dolazi do kopiranja svojstava!). Syntax-a za kreiranje objekat je:

Metoda Object.create() u pozadini izvršava sledeće taskove:

  1. Kreira se novi objekat
  2. Novi objekat se povezuje sa objektom od koga je nastao i tako se ubacuje u lanac nasledjivanja, nakon čega može ima pristup njegovim delegiranim metodama
  3. Opciono može da definiše i nova svojstva objekta.

Više o ovome pročitajte u članku “1001 način kreiranja objekata”.

Object.assign()

Ovo svojstvo kopira sva svojstva jednog ili više objekata kod kojih je enumerable deskriptor svojstva setovan na true, a zatim vraća objekat.

Kloniranje objekata

NAPOMENA:
Ovo svojstvo kopira samo “lična svojstva objekta”, ne i svojstva duž prototipskog lanca nasledjivanja.

Spajanje više objekata u jedan

Ovo svojstvo može da se koristi i sa više objekata, stim što treba naglasiti da duplirana svojstva se ne prikazuju kao dva već kao jedno svojstvo.

Object.getPrototypeOf()

Sa ovom metodom dobijamo koji je prototype objekat odredjenog objekta.

Ova metoda nije nejbolje radila za vreme ES5 standarda medjutim poboljšana je sa ES2015 standardom.

Primer

Object.setPrototypeOf()

Ekstendovanje konstruktorske funkcije se vrše korišćenjem metode Object.create(), koja definiše prototype objekat jednog objekta durugom (pročitajte malo više o ovome u članku 1001 način kreiranja objekata u JS-u.

Medjutim object literal nema svoju konstruktorsku funkciju pa je potrebno koritisti metodu Object.setPrototypeOf(), koja dodeljuje prototype objekat drugom objeku.

NAPOMENA:
Ova metoda je zamena za nestandardizovanu metodu Object.prototype.__proto__ (pročitajte više o njoj u članku “Prototipsko nasledjivanje”), koja nije bila preporučena za korišćenje jer je veoma spora, isto važi i za metodu Object.setPrototypeOf(), stoga je izbegavajte!

Primer

Object.defineProperty()

Metoda Object.defineProperty() definiše ili modifikuje svojstva objekta.

Primer

Ovo svojstvo može da se koristi pravljenje privatnih svojstva uz korišćenje specijalnih metoda tzv. “get-era” i “set-era”.

Sa ovakim mehanizmom, svaki put kada želimo da ostvarimo interakciju sa svojstvom “punoIme ostvarujemo ili sa “get_punoIme()” ili “set_punoIme()” metodom.

Object.is()

JS je “loosely typed” jezik, koji u odredjenim situacijama implicitno konvertuje tipove. Konvertovanje pri poredjenju sa “==” operatorom često daje neželjene rezultate.

Stoga se često koristi “===”, mada i poredjenje sa ovim operatorom može da da nelogičan rezultat:

Primer

Sve ove probleme rešava metoda Object.is() koja proverava da li su dva objekta jednaka, i to radi bez greške.

Primer

Primer

Takodje rešava i menje poznate nedoslednosti JavaScripta i vraća odogovarjući odgovor, kao što su:

Pogledajte tablicu sa rezultatima poredjenja koristeći operatore ==, === i metodu Object.is():

tabela komparacije

Object.values

Kreira niz od svih vrednosti “enumerable” svojstva objekta (bez svojstva duž lanca nasledjivanja).

Primer

NAPOMENA:
Redosled članova je random isto kako kod for..in petlje!

Object.keys

Kreira niz od svih ključeva “enumerable” svojstva objekta (bez svojstva duž lanca nasledjivanja).

Primer

NAPOMENA:
Redosled članova je random isto kako kod for..in petlje!

Object.entries

Kreira niz od svih [key, value] parova “enumerable” svojstva objekta (bez svojstva duž lanca nasledjivanja).

Primer

NAPOMENA:
Redosled članova je random isto kako kod for..in petlje!

Object.getOwnPropertyNames()

Ova metoda vraća niz svih ključeva objekta pa čak i onih svojstava kod kojih je deskriptor enumerable: false

NAPOMENA:

Za pregled svojstava objekta može da se koristi i petlja “for..in” koja prolazi kroz sva svojstva (koja imaju setovano enumerable: true) objekta i celog prototype lanca.

Object.getOwnPropertyDescriptor()

Deskriptore svojstva nekog objekta dobijamo koristeći metodu “Object.getOwnPropertyDescriptor()”:

Primer

Object.getOwnPropertyDescriptors()

Sa ovom metodom dobijamo sva “lična” (ne nasledjena) svojstva i njihove deskriptore svojstava:

Koristi se za kloniranje objekata

Object.PreventExtension()

Ako želimo da sprečimo dodavanje novih svojstva nekom objektu koristimo metodu “Object.PreventExtension()”

Object.seal()

Metoda “Object.seal()” uzima objekat i za njega poziva prethodnu metodu preventExtension(), i takodje postavlja deskriptor configurable na false (=> configurable: false + sprečeno dodavanje novih svojstva). Rezultat ove metode je da se objektu ne mogu dodati nova svosjtva, kao i da se postojeća svojstva ne mogu izbrisati, niti da se mogu promeniti drugi deskriptori osim deskriptora “value”

Object.freeze()

Metoda “Object.freeze()” preuzima postojeći objekat, i za njega poziva metodu “Object.seal()” i svim svojstvima objekta menja vrednost descriptora “writable” na false (=> writable: false, configurable: false + sprečeno dodavanje novih svojstva). Ova metoda omogućuje najviši nivo nepromenjivosti objekta.

Podelite:

3 Responses to “Svojstva i metode konstruktorske f-je Object()”

Ostavite komentar