Avatar billede jakwag Nybegynder
30. juni 2003 - 15:32 Der er 12 kommentarer og
1 løsning

navn på Object object

Hej

Hvis man har et movieclip kan man få fat i dets navn ved at bruge en property der hedder _name.

Jeg kunne godt tænke mig at gøre følgende:

product = new Object();
product.getName = function(){
return this._name;
}
trace(product.getName()); // output = product

Jeg var godt klar over at dette aldrig ville virke, da _name er en property specifikt til movieClips.

Men hvordan kan det gøres? Hvis det altså kan gøres.


: ) Jakob
Avatar billede pyroman Nybegynder
30. juni 2003 - 16:02 #1
hmmm, man kan gøre det på en lidt andet måde:

MovieClip.prototype.createObject = function (name){
    this[name] = new Object();
        this[name]._name = name;
}

createObject("product");

og så bare:

trace(product._name);
//output:"product"

/Filip
Avatar billede jakwag Nybegynder
01. juli 2003 - 08:49 #2
Hej

Det er desværre ikke godt nok. Det skal bruges i en dump method på Object classen, som kan dumpe et hvert object og vise dets propeties. Det kan jeg sagtens lave, men det kunne være fedt hvis den også kunne skrive navnet på det object den dumpede.

Jeg er slet ikke sikker på at det kan lade sig gøre.
Avatar billede pyroman Nybegynder
03. juli 2003 - 15:20 #3
Hmm du kan i hvert fald ikke få variablen _name til at blive en fast property for Object-klassen hvis det er det du vil. Men med et større projekt kan du lave dit eget property og function system hvor du bare laver alle dine egne properties og de faste om til funktioner der indeholder oplysningerne som så kan udskrives...

Men ellers kan det ikke lade sig gøre...
Avatar billede barklund Nybegynder
05. juli 2003 - 14:58 #4
Et objekt er jo bare en samling af egenskaber og metoder. Dette objekt kan du så lave referencer til:

etObjekt = new Object();
etObjekt.tal = 4;
etAndetObjekt = etObjekt;

Så er etObjekt en reference til et objekt, der indeholder en egenskab.

Men etAndetObjekt er jo en reference til fuldstændig det samme objekt. "Inde" fra objektet aner det jo ikke, hvilke referencer, der findes på objektet. Der kan jo være tusindvis af referencer til samme objekt (eller 0), så hvordan skal man inde fra objektet kunne gætte, hvad en af dem hedder?
Avatar billede jakwag Nybegynder
06. juli 2003 - 12:12 #5
Barklund > Good point!

Men hvordan kan det så lade sig gøre på moviclips? De er vel lige så meget et objekt som f.eks. en array.

Man kan jo også sagtens:

trace(movie1_mc._name);
movie2_mc = movie1_mc;
trace(movie2_mc._name); // begge trace giver heldigvis movie1_mc

Der bliver altså automatisk lavet en property der hedder _name på et MC. Kan det være derfor (bl.a.) at moviclips og textfields bliver lavet med en method istedet for med new?
Avatar billede jakwag Nybegynder
06. juli 2003 - 13:28 #6
og så er der selvfølig point til dig hvis du svare...
Avatar billede barklund Nybegynder
06. juli 2003 - 13:42 #7
Exactly... Movieclips og Textfields er jo ikke "standard" objekter - men har også en kompleks grafisk repræsentation.

Movieclips er oprettet således, at de har en "rigtig" sti og et "rigtig" navn, som er der, hvor de første gang bliver oprettet. Det er jo også her, de vil være synlige i forhold til mc-hierarkiet. Faktisk er _name ikke kun en readonly-egenskab, men du kan også sætte den (hvilket sletter stien til et oprindelige movieclip og laver et nyt):

num2_mc = this.createEmptyMovieClip("num1_mc", 1);
trace("num1 name = "+num1_mc._name);
trace("num2 name = "+num2_mc._name);
num1_mc._name = "num3_mc";
trace("num1 name = "+num1_mc._name);
trace("num2 name = "+num2_mc._name);
trace("num3 name = "+num3_mc._name);

Altså skulle du lave et objekt på samme måde:

mitCustomObjekt = function (parent, name) {
    this.$_parent = parent;
    this.$_name = name;
    parent[name] = this;
};
mitCustomObjekt.prototype.getName = function() {
    return this.$_name;
};
mitCustomObjekt.prototype.setName = function(name) {
    delete this.$_parent[this.$_name];
    this.$_name = name;
    this.$_parent[name] = this;
};
mitCustomObjekt.prototype.addProperty("_name", mitCustomObjekt.prototype.getName, mitCustomObjekt.prototype.setName);
obj2 = new mitCustomObjekt(this, "obj1");
trace("obj1 name " + obj1._name);
trace("obj2 name " + obj2._name);
obj1._name = "obj3";
trace("after: obj1._name = \"obj3\"");
trace("obj1 name " + obj1._name);
trace("obj2 name " + obj2._name);
trace("obj3 name " + obj3._name);

Okay - af ovenstående eksperiment blev jeg selv meget klogere! Så mange tak for at stille spørgsmålet :)

/Barklund
Avatar billede barklund Nybegynder
06. juli 2003 - 13:44 #8
Og et svar, dér :)
Avatar billede barklund Nybegynder
06. juli 2003 - 13:47 #9
I ovenstående har jeg lavet den med "new" - men i praksis ville det være smarterere at smide den på Movieclip.prototypen som pyroman foreslog helt i starten.
Avatar billede barklund Nybegynder
06. juli 2003 - 13:49 #10
Og man kunne endda beskytte funktionen helt ved at kræve et tredje argument som skulle være "12345foobar" som Movieclip funktionen vidste men som man ikke kunne gætte. Så kunne ethvert forsøg på at bruge "new mitCustomObjekt" bare returnere null...
Avatar billede jakwag Nybegynder
06. juli 2003 - 13:54 #11
Velbekomme, jeg skal nok se om jeg kan finde på flere kryptiske spm. hehe.

Tak fordi du gider at skrive så meget, det er sgu kanon.

Lige en sidste ting: hvad gør $?
Avatar billede barklund Nybegynder
06. juli 2003 - 13:55 #12
Jeg anvender $ foran variablen, fordi den er beskyttet i den forstand, at brugeren ikke må sætte eller læse den direkte - kun via egenskaben "_name" som jeg kan kontrollere...
Avatar billede barklund Nybegynder
06. juli 2003 - 13:55 #13
Hvis brugeren sætter $_name så går det galt... Man kan godt beskytte det endnu bedre men bare for eksemplets skyld.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB