Avatar billede idiotbarn Nybegynder
19. juli 2007 - 14:35 Der er 13 kommentarer og
1 løsning

Prototyper i eksterne filer

Hej eksperter
Jeg har siddet med et problem lidt tid. Jeg vil gerne have mig en ekstern fil med ekstra prototyper til fx string.

Jeg kan ikke få det til at fungere helt, og er heller ikke helt sikker på jeg er i den rigtige retning. Jeg vil gerne kunne tilføje fx en replace funktion, og det går fint hvis man bruger:
String.prototype.replace = function... inde i selve fla filen, men hvordan får jeg den flyttet ud i en ekstern fil?

mvh
Avatar billede mat Nybegynder
19. juli 2007 - 15:02 #1
Med #include.

I "proto.as";

String.prototype.replace = function ( s:String ) {
        trace(s);
}

I din fla;

#include "proto.as"
var str:String = new String();
str.replace("hej");

mvh mat
Avatar billede idiotbarn Nybegynder
19. juli 2007 - 15:28 #2
Nice, men hvad gør jeg galt:

- FLA: -
#include "c:/Inetpub/wwwroot/FlashModules/Extentions/StringExtention.as"
var test:String = "";
test.rep("a");

- StringExtention.as: -
String.prototype.rep = function ( s:String ) {
        trace("REPPP_ "+s);
}


- FEJL: -
**Error** Scene=Scene 1, layer=Layer 5, frame=1:Line 3: There is no method with the name 'rep'.
    test.rep("a");

Total ActionScript Errors: 1     Reported Errors: 1


Skulle stien ikke være fin, jeg har prøvet at kopiere den ind i "kør" og den finder fint filen?
Avatar billede maqhem Nybegynder
19. juli 2007 - 15:33 #3
var test:String = "";

Du skal ikke blot fasttype, men initialisere med statement "new":

var test:String = new String();
Avatar billede idiotbarn Nybegynder
19. juli 2007 - 15:44 #4
hmm...det giver nu det samme...(samme fejl som ovenfor)
Avatar billede maqhem Nybegynder
19. juli 2007 - 15:55 #5
Hov ja det kan jeg da godt se. Kan det tænkes, String måske ikke er dynamic? Jeg ved ikke helt, om det har noget at sige, men måske... Ej jeg skal vidst bare tie stille.
Avatar billede maqhem Nybegynder
19. juli 2007 - 16:01 #6
Hov det må da være det:

Object.prototype.m = function(s:String):Void {
    trace(s);
}
var j:Object = new Object();
j.m("test");

Output:test

String.prototype.m = function(s:String):Void {
    trace(s);
}
var j:String = new String();
j.m("test");

Output:There is no method with the name 'm'.
Avatar billede mat Nybegynder
20. juli 2007 - 07:24 #7
maqhem > I min Flash 8 giver din kode output;

test
test

Men det kan være strict mode, prøv lige med;

String.prototype.m = function(s:String):Void {
    trace(s);
}
var j:String = new String();
j["m"]("test");

mvh mat
Avatar billede maqhem Nybegynder
21. juli 2007 - 11:34 #8
Ja okay, nu duer det fint. Men jeg troede, at j["m"]("test"); og j.m("test"); betød nøjagtigt det samme.
Avatar billede mat Nybegynder
23. juli 2007 - 07:23 #9
Det gør det også, men sidstnævnte er bare for at komme rundt om compilerfejlmeddelelser i strict mode. Men du har ret i at fejlen ikke ville opstå hvis String var dynamisk.

mvh mat
Avatar billede idiotbarn Nybegynder
23. juli 2007 - 15:18 #10
men er der nogen af jer der ved hvorfor det skal gøres anderledes hvis det er i eksterne filer?
String.prototype.m = function(s:String):Void {
    trace(s);
}
virker jo fint hvis det er inde i fla'en man gør det?
Avatar billede mat Nybegynder
24. juli 2007 - 07:54 #11
Det lyder umiddelbart som noget der kunne fikses med compilersettings? Jeg har ikke Flash CS3, men i Flash 8 er der ingen problemer.

Men hvis du vil udvide String hvorfor så ikke lave din egen klasse, der nedarver fra String?

mvh mat
Avatar billede idiotbarn Nybegynder
25. juli 2007 - 12:05 #12
Det er også i flash 8, men virker det hos dig, så er det sikkert bare en dummefejl fra min side... Ligger du et svar mat?
Avatar billede mat Nybegynder
25. juli 2007 - 13:26 #13
aight
Avatar billede idiotbarn Nybegynder
25. august 2007 - 17:23 #14
hmf...ok...nu er jeg forvirret...
Laver jeg:
String.prototype.replace = function (pattern, replacement)
{
  trace("test here");
  return this.split(pattern).join(replacement);
}

i en ekstern fil og inkludere den med #include i en hel ny og ren fil:
#include "Test.as"

var a:String = "asssdasd";
a = a.replace("d","__");
trace(a);

Det hele virker fint... omdøber jeg funktionen til:
String.prototype.replacer = function (pattern, replacement)
{
  trace("test here");
  return this.split(pattern).join(replacement);
}

og laver ændringen i fla filen (eller opretter en hel ny flash fil og forsøger)
Får jeg at vide funktionen ikke eksistere???

Opretter jeg en hel ny .as fil med koden:
String.prototype.replacer = function (pattern, replacement)
{
  trace("test here");
  return this.split(pattern).join(replacement);
}

og inkludere den i en hel ny fla fil...får jeg igen at vide funktionen ikke eksistere?
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