[JS] function.call op prototyped function

Pagina: 1
Acties:

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
Ik probeer het volgende:

ik roep een functie aan:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
myobject=new targetobject();

targetobject.prototype{
 getoption = function(chosenvalue){
  alert(chosenvalue);
 }
}

function modal(displaytext,options,targetobj,targetfunction){
// genereer een x aantal html radio buttons, met onlcick=function handlers.
 onclick=function(){
  targetfunction.call(targetobj,options[i]);
 }
}

modal('tekst',new Array('one','two','three'), myobject,getoption);


Nu moet er binnen modal (een normale functie), een call worden gedaan naar getoption, als member van myobject, met de gekozen waarde uit de array als argument.

Ik had eerst getoption gewoon als normale functie aan m'n script geplakt, en dan via this.getoption=getoption; in myobject de koppeling gelegt.
Omdat dit redelijk funzig is, en dus een functie te veel in aan het document knoopt ben ik dus gaan rewriten naar prototyped functies.

Als ik nu echter de oude manier gebruik om de functie aan te roepen lukt dat niet meer.

Met functie.call( myobject,arguments), ging het altijd prima, omdat de functie dan member van het document is. Maar nu natuurlijk niet meer.

Als ik echter modal('tekst',new Array('one','two','three'), myobject.getoption);
oproep, kan hij die functie niet executen. (wordt hij dan meteen uitgevoerd?)

Wie of Wie weet en oplossing?

openkat.nl al gezien?


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
Hmm,

Ik weet niet of ik het probleem goed uitleg,

Maar wat ik wil doen is dus:

Een prototyped functie aanroepen vanuit een gegenereerde onclick handler die zich niet in dat object bevindt. (maar wel de functie, en het object als argumenten kan ontvangen)

openkat.nl al gezien?


  • André
  • Registratie: Maart 2002
  • Laatst online: 11-02 14:19

André

Analytics dude

Ik heb er nu een tijdje naar zitten staren, maar ik begrijp niet wat je wil.

Kun je in die onclick niet gewoon dit doen:
JavaScript:
1
2
3
4
5
targetobj.targetfunction(options[i]);

of:

eval(targetobj + "." + targetfunction + "(" + options[i] + ")");

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:34

crisp

Devver

Pixelated

Dit werkt gewoon:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Foo(text)
{
    this.string = text;
}
Foo.prototype =
{
    test: function()
    {
        alert(this.string);
    }
}

function whatever(object, method)
{
    method.call(object);
}

var foo = new Foo('testing testing');
whatever(foo, foo.test);


Ik denk dat je de mist ingaat met je references in je anonymous function wat effectief een closure is, ik denk dat je dat eruit moet halen:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
function modal(displaytext, options, targetobj, targetfunction)
{
 // ...
 onclick = createOnclickHandler(targetobj, targetfunction, options[i]);
}

function createOnclickHandler(targetobj, targetfunction, parameter)
{
  return function()
  {
    targetfunction.call(targetobj, parameter);
  }
}

Intentionally left blank


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
hmm, ok testen dus.

Ik dacht dat ik iets structureel verkeerd deed :) (wat alsnog best zo zou kunnen zijn natuurlijk)

Maar als het zo wel moet werken, dan vraag ik me af waarom steeds errors krijg met targetFunction (string waarde) not valid,.
Of als ik de boel anders invoer, juist weer targetFunction (de varnaam) not set.

ik ga ff debuggen.

Eval wilde ik uiteraard iet gebruiken als het niet hoeft.

Edit:

Ik kom niet verder dan:
targetfunction has no properties.

Ik heb de code op:
http://www.pc-gamers.com/webgamex/0.8

De aanroep van het modal windows (hoe wist je dat crisp?) gebeurt op regel: 53 van de index.
De modal functie zelf staat op regel ; 87 van freevolution.js
De modal onclick functie (naar model van crisp staat daar achter.

De aangroepen functie intmap van het obejct freevolution, staat op: 172

Kan iemand de bug zien?
Ik heb volgens mij alles zoals crisp het voorstelt. toch?

[ Voor 45% gewijzigd door killercow op 17-08-2006 11:36 ]

openkat.nl al gezien?


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
Ok, er is duidelijk iets ander aan de hand,

als ik de functie nu direct aanspreek doet hij het ook niet :P

Dus gewoon:
target=new objecttype(); target.targetfunction();

target.targetfunction is not a function.

Edit:

gevonden!

je mag blijkbaar maar een prototype block per object gebruiken?

En hoe smeer je functies dan uit over verschillende files die elk een set extending functies aandragen?
Crisp (dank je idd, ik zag het ook net)

[ Voor 34% gewijzigd door killercow op 17-08-2006 15:13 ]

openkat.nl al gezien?


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:34

crisp

Devver

Pixelated

In freevolution_cursor.js overschrijf je de prototyped methods van je freevolution object ;)

Intentionally left blank


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
yay, alles werkt zo'n beetje

op zoek naar een optie om verschillende files een eigen prototype te laten hebben op het zelfde object.
dan kan ik verschillende funcites netjes bij elkaar groeperen.

openkat.nl al gezien?


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:34

crisp

Devver

Pixelated

Je zou een prototype.extend() kunnen bakken die de properties van een object 1 voor 1 als methods toekent aan een ander object ;)

en anders gewoon zo:
JavaScript:
1
2
3
4
5
6
7
8
9
foo.prototype =
{
  foo: 'bar';
}

// nog meer properties toekennen:
foo.prototype.newmethod1 = function() {}
foo.prototype.newmethod2 = function() {}
// etc.

[ Voor 45% gewijzigd door crisp op 17-08-2006 15:32 ]

Intentionally left blank


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:34

crisp

Devver

Pixelated

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Object.prototype.extend = function(obj)
{
    var method;
    for (method in obj)
    {
        if (!Object.prototype.hasOwnProperty(method))
            this[method] = obj[method];
    }
}

function Foo() {}
Foo.prototype =
{
    test1: function()
    {
        alert('test1');
    }
}

Foo.prototype.extend(
{
    test2: function()
    {
        alert('test2');
    },
    test3: function()
    {
        alert('test3');
    }
}
);


var foo = new Foo();
foo.test1();
foo.test2();
foo.test3();

:P

Intentionally left blank


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
ahh, extend

Thank you! het wordt nog eens wat zo. :)

openkat.nl al gezien?


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:34

crisp

Devver

Pixelated

killercow schreef op donderdag 17 augustus 2006 @ 16:40:
ahh, extend

Thank you! het wordt nog eens wat zo. :)
Da's niet standaard hè ;)

Intentionally left blank


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
oh, hmm

oke, ik wilde IE support toch al droppen, want daar zit ZO veel werk in.

(of is het juist een IE property? , ik ga wel ff zoeken)

openkat.nl al gezien?


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:34

crisp

Devver

Pixelated

Kijk eens goed naar het eerste stukje van mijn voorbeeld:
JavaScript:
1
2
3
4
5
6
7
8
9
Object.prototype.extend = function(obj)
{
    var method;
    for (method in obj)
    {
        if (!Object.prototype.hasOwnProperty(method))
            this[method] = obj[method];
    }
}

;)

Intentionally left blank


  • killercow
  • Registratie: Maart 2000
  • Laatst online: 12-02 10:50
agh, tering :)

ik moet idd leren lezen :)

openkat.nl al gezien?

Pagina: 1