Forum » Programiranje » [JavaScript] Objects
[JavaScript] Objects
zbrisan ::
// here we define our method using "this", before we even introduce bob var setAge = function (newAge) { this.age = newAge; }; // now we make bob var bob = new Object(); bob.age = 30; // and down here we just use the method we already made bob.setAge = setAge; // tole vrstico ne razumem najbolje ce mi lahko kdo razlozi <--- // change bob's age to 50 here bob.setAge(50); // zakaj tukaj nebi slo ce bi napisal "setAge(50);" ? <---
korenje3 ::
bob.setAge = setAge;
setAge je spremenljivka (v tem primeru ji je dodeljena funkcija), ki jo enačiš z bob.setAge (ki je objekt)
enako kot: bob = {setAge:setAge}
zato ker je bob.setAge po novem funkcija... za funcije velja "function(variable){};
zadnja vrstica torej požene funkcijo z dodeljeno vrednostjo 50.
in ja šlo bi tudi z setAge(50); ali pa z bob.setAge(50); je popolnoma enako. samo razika je znotraj funkcije, kjer imaš "this". this je objekt v katerem je setAge (torej bob)
setAge je spremenljivka (v tem primeru ji je dodeljena funkcija), ki jo enačiš z bob.setAge (ki je objekt)
enako kot: bob = {setAge:setAge}
zato ker je bob.setAge po novem funkcija... za funcije velja "function(variable){};
zadnja vrstica torej požene funkcijo z dodeljeno vrednostjo 50.
in ja šlo bi tudi z setAge(50); ali pa z bob.setAge(50); je popolnoma enako. samo razika je znotraj funkcije, kjer imaš "this". this je objekt v katerem je setAge (torej bob)
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Zgodovina sprememb…
- spremenil: korenje3 ()
celebro ::
in ja šlo bi tudi z setAge(50); ali pa z bob.setAge(50); je popolnoma enako. samo razika je znotraj funkcije, kjer imaš "this". this je objekt v katerem je setAge (torej bob)
To ni res, efekt teh dveh klicev je zelo različen. "this" je vezan na objekt nad katerim kličeš funkcijo, ne kjer je funkcija shranjena. "bob.setAge(50);" nastavi age property na objektu bob, "setAge(50);" pa na objektu "window". Ali pa dobiš runtime exception, če si slučajno v striktnem načinu.
win64 ::
Nekaj razlage, kako naj bi to delalo v ozadju.
Funkcija je tudi nekakšen objekt, ki ima nekaj svojih metod. Dve pomembni za razlago sta call(), ter apply. Te dve metodi omogočata, da kličeš funkcijo in sam definiraš kam naj "this" kaže.
Če pogledamo primer:
Funkcija je tudi nekakšen objekt, ki ima nekaj svojih metod. Dve pomembni za razlago sta call(), ter apply. Te dve metodi omogočata, da kličeš funkcijo in sam definiraš kam naj "this" kaže.
Če pogledamo primer:
//primer z objektom
bob.setAge(50); // to bi lahko napisali tudi tako setAge.call(bob, 50);
// v tem primeru bi funkcija zagnala bob.age = 50;
//primer brez implicitno definiranega objekta
setAge(50) // to je enako, kot da bi napisal setAge.call(window, 50); ali kot je napisal celebro, bi setAge(50) vrgel napako v strict načinu.
// v tem primeru bi funkcija zagnala window.age = 50;
korenje3 ::
in ja šlo bi tudi z setAge(50); ali pa z bob.setAge(50); je popolnoma enako. samo razika je znotraj funkcije, kjer imaš "this". this je objekt v katerem je setAge (torej bob)
To ni res, efekt teh dveh klicev je zelo različen. "this" je vezan na objekt nad katerim kličeš funkcijo, ne kjer je funkcija shranjena. "bob.setAge(50);" nastavi age property na objektu bob, "setAge(50);" pa na objektu "window". Ali pa dobiš runtime exception, če si slučajno v striktnem načinu.
to kar sem napisal je res, samo ti definiraš tisto kar nisem napisal kot da ni res. verjetno dobiš več pozornosti ko začneš pisanje s "to ni res".
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
zbrisan ::
Imam še eno težavo, kako v funkciji ageDifference/olderAge ve kdo je "person1" pa "person2"?
// Our person constructor function Person (name, age) { this.name = name; this.age = age; } // We can make a function which takes persons as arguments // This one computes the difference in ages between two people var ageDifference = function(person1, person2) { return person1.age - person2.age; }; // Let's bring back alice and billy to test our new function var alice = new Person("Alice", 30); var billy = new Person("Billy", 25); var olderAge = function(person1, person2) { // Make a new function, olderAge, to return the age of the older of two people if((person1.age) > (person2.age)){ return person1.age; }; if ((person1.age) < (person2.age)){ return person2.age; }; if(person1.age === person2.age){ return person1.age,person2.age; }; }; console.log("The older person is " + olderAge(alice, billy));
korenje3 ::
V 33. vrstici ko kličeš olderAge() podaš objekt alice in billy. Znotraj funkcije (20. vrstica) se torej alice dodeli person1, billy pa je enako person2.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
celebro ::
in ja šlo bi tudi z setAge(50); ali pa z bob.setAge(50); je popolnoma enako. samo razika je znotraj funkcije, kjer imaš "this". this je objekt v katerem je setAge (torej bob)
To ni res, efekt teh dveh klicev je zelo različen. "this" je vezan na objekt nad katerim kličeš funkcijo, ne kjer je funkcija shranjena. "bob.setAge(50);" nastavi age property na objektu bob, "setAge(50);" pa na objektu "window". Ali pa dobiš runtime exception, če si slučajno v striktnem načinu.
to kar sem napisal je res, samo ti definiraš tisto kar nisem napisal kot da ni res. verjetno dobiš več pozornosti ko začneš pisanje s "to ni res".
Napisal si, da je setAge(50); ali pa bob.setAge(50); popolnoma enako. Kar pa ni res. Prvo nastavi age na window objektu, drugo pa na bob objektu.
korenje3 ::
Ne, prvo poda vrednost 50 funkciji setAge(), drugo pa poda vrednost 50 funkciji bob.setAge().
Lahko se delaš še bolj glupega, sam dejstva so dejstva.
Lahko se delaš še bolj glupega, sam dejstva so dejstva.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W
noraguta ::
Eno je funkcija drugo je metoda, ki je by desegn kontekstno vezana na dotičen objekt bob.
Pust' ot pobyedy k pobyedye vyedyot!
celebro ::
noraguta ::
Pust bedaka k ne loč med kostrukti vbprogramskih jezikih.
Pust' ot pobyedy k pobyedye vyedyot!
zbrisan ::
Trenutno sem pri Prototype pa ne razumem najbolje. Če je kaksna razlaga v slovenscini, v anglescini sem bral pa mi se vedno ni najbolj jasno. Lahko mi pa kdo razlozi tudi na spodnji kodi. Pa hvala za pomoc do sedaj in se za naprej :)
Aja pa ce priporocate tudi kaksno knjigo o JS v slovenscini?
// original classes function Animal(name, numLegs) { this.name = name; this.numLegs = numLegs; this.isAlive = true; } function Penguin(name) { this.name = name; this.numLegs = 2; } function Emperor(name) { this.name = name; this.saying = "Waddle waddle"; } // set up the prototype chain Penguin.prototype = new Animal(); Emperor.prototype = new Penguin(); var myEmperor = new Emperor("Jules"); console.log( myEmperor.saying ); // should print "Waddle waddle" console.log( myEmperor.numLegs ); // should print 2 console.log( myEmperor.isAlive ); // should print true
Aja pa ce priporocate tudi kaksno knjigo o JS v slovenscini?
Zgodovina sprememb…
- spremenilo: zbrisan ()
youPlonker ::
// original classes function Animal(name, numLegs) { this.name = name; this.numLegs = numLegs; this.isAlive = true; } function Penguin(name) { this.name = name; this.numLegs = 2; } function Emperor(name) { this.name = name; this.saying = "Waddle waddle"; }
Zgornjim javascript funkcijam rečemo konstruktorji. Lahko tudi rečeš, da so to razredi (classes). Razred je nek načrt za štancanje objektov. To je podobno kot v grški filozofiji ideja arhetipa. Npr. avtomobilska firma ima en načrt za nek model avtomobila(razred) in potem z uporabo tega enega samega načrta naštanca mnogo avtomobilov istega tipa (več instanc ali več objektov). Spodaj je način, kako z uporabo konstruktorja Emperor konstruiraš objekt:
var myEmperor = new Emperor("Jules");
Spremenljivka myEmperor sedaj drži objekt, ki si ga naštancal s pomočjo konstruktorja Emperor. Ta objekt zna vse, kar je bilo rečeno v načrtu. Če boš npr. klical
myEmperor.numLegsbo javascript vrgel undefined. Zakaj? Zato, ker je lastnost numLegs definirana zgolj v konstruktorju za žival (Animal), ti pa si prej uporabil konstruktor Emperor.
Sedaj pa imaš dve poti. Lahko narediš tole:
myEmperor.numLegs = 2;in samo objekt v spremenljivki myEmperor naučiš nove lastnosti numLegs z vrednostjo na 2. Ampak to pomeni, da če boš imel takih objektov mnogo, boš moral vsakega posebej učiti lastnosti numLegs.
Druga pa je pot iz tega tutoriala, po njej pa boš ti sam načrt za Emperorja posodobil tako, da bo se bo pričel nekako "zavedat", da je potomec razreda Animal. In s tem zavedanjem bo tudi dobil možnost uporabe numLegs. Temu se v programiranju splošno reče dedovanje in javascript je v tem pogledu zelo vesoljski, temu tudi to prototipiranje in besedica prototype.
// set up the prototype chain Penguin.prototype = new Animal(); Emperor.prototype = new Penguin();
Kar naredi zgornja koda je, da načrt za Penguina najprej posodobi z vsem, kar vsebuje načrt za Animal, potem pa načrt za Emperorja posodobi še z vsem kar vsebuje načrt za Penguina.
Kar skuša ta tutorial naučiti je, da obstaja ti. prototype chain in da Emperor na koncu dobi ne samo stvari iz načrta za Penguin, ampak posredno tudi iz načrta za Animal. Se pravi gre za neko verigo, v kateri nekdo spodaj (v tem primeru Emperor) deduje lastnosti od starša (v tem primeru Animal). Malo sem se zapisal mja... Drugače pa ti priporočam, da odpreš javascript konzolo v Chrome (tipka F12) in skopiraš tole celotno svojo kodo notr, nato pa poskušaj dostopati/spreminjati prototip in glej malo, kaj se dogaja.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | javascript - gnezdenje - konkretno na mojem primeruOddelek: Programiranje | 2603 (2051) | geca |
» | [Qt/C++]problem z Undefined reference na konstanti znotraj razredaOddelek: Programiranje | 2333 (2003) | phantom |
» | [Java] Nejasna nalogaOddelek: Programiranje | 985 (747) | hexor |
» | [Android]Software Design vprasanjeOddelek: Programiranje | 1913 (1733) | KernelPanic |
» | [Flash] predvajanje videaOddelek: Programiranje | 1756 (1604) | R33D3M33R |