» »

[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)
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

zbrisan ::

Hvala za tole, zdej mi je bolj jasno :)

celebro ::

korenje3 je izjavil:


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:


//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 ::

celebro je izjavil:

korenje3 je izjavil:


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

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

zbrisan ::

Oh sej res ja, tnx za tole.

celebro ::

korenje3 je izjavil:

celebro je izjavil:

korenje3 je izjavil:


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.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
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 ::

korenje3 je izjavil:

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.

Pa si ti sploh pogledal, kako je setAge definirana?

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 :)

// 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.numLegs
bo 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.

zbrisan ::

Hvala ti za to razlago :) Mi je bolj razumljivo kot prej.

noraguta ::

Nč ni arhetip je kar tip objekta.
Pust' ot pobyedy k pobyedye vyedyot!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

javascript - gnezdenje - konkretno na mojem primeru

Oddelek: Programiranje
162603 (2051) geca
»

[Qt/C++]problem z Undefined reference na konstanti znotraj razreda

Oddelek: Programiranje
102333 (2003) phantom
»

[Java] Nejasna naloga

Oddelek: Programiranje
6985 (747) hexor
»

[Android]Software Design vprasanje

Oddelek: Programiranje
91913 (1733) KernelPanic
»

[Flash] predvajanje videa

Oddelek: Programiranje
91756 (1604) R33D3M33R

Več podobnih tem