[Javascript] Prototype probleem

Pagina: 1
Acties:
  • 243 views sinds 30-01-2008
  • Reageer

  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
Dag tweakers

ik heb een klein test scriptje gemaakt, die later wel wordt gebruikt, maar de bedoeling van dat scriptje
is als volgt:

ik roep eerst een functie aan die een nieuw object voor me aanmakt
dat object heeft als extra functie dat hij bij zichzelf iets kan wijzigen: bijv:

object.prototype.editMe = function() { //etc/}

nu wil ik dus eigenlijk via oncontextmenu een menu naar voren laten komen waarin ik dus alle
doormij aan gemaakt methods worden weergegeven en kunnen worden aangeroepen
dmv

object.prototype.oncontextmenu = function() {
//laatmenuzien
}

dit moet een standaard divje met opties zijn, kan in hrefjes kan in buttons het maakt niet uit als het
maar een onclick event heeft. nadeel hiervan is, is dus op het moment dat ik dat doe niet meer
in mijn object zit en hem dan dus kwijt ben.

ik heb geprobeer het te laten onthouden dmv een variabele maar dan kom ik dus niet meer in dat object en kan ik alleen nog maar globale functies aanroepen.

is dit te omzeilen ?


hieronder nog stukje voorbeeld code:
op het moment dat ik dus op een link in mijn divje klik is hij het object (logish) kwijt
maar hoe kan ik deze behouden ?

code:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--

    currentUpdateElement = null;

    
    window.onload = function() {

        new tableElement;
    }
    
                //hier in deze functie wil ik dus laten onthouden met welk
                //object hij bezig is dmv currentUpdateElement
    tableElement.prototype.editTableElement = function() {
        
        currentUpdateElement = this;

        document.getElementById('contextMenutable').style.display = 'inline';

        return false;
    }

    tableElement.prototype.insertTablerow = function() {
        alert(this.rows.length);
    }

        

    function tableElement() {

        myElement = document.createElement("TABLE");
        
        myElement.border = 1;
        myElement.oncontextmenu = this.editTableElement;
        
        myRow = myElement.insertRow(0);
        cell = myRow.insertCell(0);
        cell.innerHTML = '&nbsp;';

        document.body.appendChild(myElement);
        
        
    }

    
//-->
</SCRIPT>
</HEAD>

<BODY id="mainBody">

<div id="contextMenutable" style="display: none; position :absolute;">

    <table>
    <tr>
        <td><a href="#" onclick="currentUpdateElement.insertRow()">Rij invoegen</a></td>
    </tr>
    <tr>
        <td><a href="#" >Cell splitsen</a></td>
    </tr>
    <tr>
        <td><a href="">[ SELECT ]</a></td>
    </tr>
    <tr>
        <td><a href="">[ OPTION ]</a></td>
    </tr>
    <tr>
        <td><a href="">[ RADIO ]</a></td>
    </tr>
    <tr>
        <td><a href="">[ CHECKBOX ]</a></td>
    </tr>
    <tr>
        <td><a href="">[ TEXT ]</a></td>
    </tr>
    <tr>
        <td><a href="">[ TEXTAREA ]</a></td>
    </tr>
    <tr>
        <td><a href="">[ HIDDEN ]</a></td>
    </tr>
    </table>


</div>



</BODY>
</HTML>

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Lees mijn post in dit topic eens door:

[js] objecten en scope

Ik kan je verder ook aanraden eens op te zoeken wat het verschil tussen lokale en globale variabelen is in js (en wat voor effect het keyword 'var' daar op heeft).

[ Voor 48% gewijzigd door Michali op 16-10-2006 14:36 ]

Noushka's Magnificent Dream | Unity


  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
ik wordt niet helemaal begrepen denk ik ..
evengoed interessant topic, heeft nu een plaatsje in mijn favorieten :)

heb het topic bestudeert maar bied toch geen oplossing voor het probleem.

het probleem is eigenlijk dat ik wel mooi alles in classes heb maar als ik die via een losse link
wil aanroepen niet meer verder kan met het keyword this omdat ik die simpelweg op dat moment
kwijt ben. en dan bedoel ik dus de constructor van mijn object (als ik dat zo goed zeg)

ik wil dus eigenlijk bereiken om via een losse functie weer verder te gaan met een class die weer
met het goede object verder gaat

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 09-02 10:42

Clay

cookie erbij?

Toch staat daar het antwoord bij, doe ipv wat je hebt bv:

JavaScript:
1
2
3
4
var self = this;
myElement.oncontextmenu = function() { 
   self.editTableElement(); 
}


en dan draait de editTableElement in de scope van de tableElement instantie.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
hm misschien even ander voorbeeldje

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
38
39
40
41
42
43
44
45
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--


    function createElement() {
        
        var self = this;

        element = document.createElement("TABLE");
        document.body.appendChild(element);

        element.border = '1';

        row = element.insertRow();
        cell = row.insertCell();
        cell.innerHTML = '&nbsp;';

        

    }

    createElement.prototype.howMany = function() {
        alert(this.rows.length);
    }
    
    window.onload = function() {
        xref = new createElement;
    }




//-->
</SCRIPT>
</HEAD>

<BODY>

<a href="#" onclick="xref.howMany();">count rows</a>
</BODY>
</HTML>



als ik nu klik en van xref de functie howmany op vraag is hij het gewoon kwijt .. ?

  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
omg .. excuses .. hoe kon ik dat over het hoofd zien |:(

had een var niet toegekend aan het object dus dan kent hij hem ook niet
het had moeten zijn:

JavaScript:
1
   this.element = document.createElement("TABLE");

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Hij is helemaal niets kwijt. Je code klopt gewoon niet. Doe maar eens een alert(1); in howMany. Welkom in JS debuggen in Internet Explorer land. :P

Noushka's Magnificent Dream | Unity


  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
dat klopt ook wel michali maar als ik dan bijv this.element.rows.length doe, dan weet hij niet
waar hij het moet zoeken :)

js werk doe ik trouwens in firefox ;)

[ Voor 14% gewijzigd door klapvee op 16-10-2006 22:00 ]


  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
ok toch nog een fout ..


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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    function createElement(typeElement) {
        
        this.formElement = document.createElement(typeElement);      
        document.getElementById('editField').appendChild(this.formElement);

        this.formElement.border = '1';
        
        

        row = this.formElement.insertRow(0);
        cell = row.insertCell(0);
        cell.innerHTML = '&nbsp;';

        this.formElement.oncontextmenu = function() {
        
            document.getElementById('tableMenu').style.display = 'inline';
            
            return false;
        }

        

    }

    createElement.prototype.testrij = function() {
        createMethod(this.createRow);
    }

    createElement.prototype.createRow = function() {
        alert(this.formElement);
    }


    function createMethod(funcRef) {
        funcRef();
    }
        
    createElement.prototype.howMany = function() {
        alert(this.formElement.rows.length);
    }
    


    function showMenu(obj) {

        currentUpdateElement = obj;
        

        return false;
    }


    
    function createNewTable() {
        
        var xref = new createElement("TABLE");
        xref.testrij();

    }


ik heb goed gekeken hoe ik toch die functies in die scope kan houden en misschien dat ik
toch nog iets fout doe. als ik nu createNewTable() aanroep komt hij met undefined terug uiteindelijk
terwijl ik hem toch in de klasse heb neergezet ?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Lees mijn post in dat andere topic nou nog eens goed.
JavaScript:
1
2
3
createElement.prototype.testrij = function() {
    createMethod(this.createRow);
}

Dan weet waarom je deze functie zo moet schrijven:
JavaScript:
1
2
3
4
5
6
7
8
9
createElement.prototype.testrij = function() {
    var self = this;
    createMethod(
        function()
        {
            self.createRow();
        }
    );
}

Noushka's Magnificent Dream | Unity


  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
Het is iets anders maar komt bijna op hetzelfde neer michali, ik heb zeer zeker wel wat gehad aan je
post, zeer leerzaam!

maar zo is het uiteindelijk dus gelukt: http://www.sourceshock.com/class.html

je kan nu tabellen genereren en die met een onclick activeren zodat je daar weer met oncontextmenu
rijen kan aanmaken en cellen kan splitsen

[ Voor 25% gewijzigd door klapvee op 17-10-2006 08:42 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 09-12-2025
Fijn dat het werkt. Dan heb ik toch nog een vraag. Heb je een goede reden waarom createMethod en createCells buiten de class moeten vallen (losse functies zijn dus)? Is dit geen betere oplossing?
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
function createElement(typeElement) {

    this.formElement = document.createElement(typeElement);      
    document.getElementById('editField').appendChild(this.formElement);

    this.formElement.border = '1';


    var self = this;

    this.formElement.oncontextmenu = function() {


        document.getElementById('tableMenu').style.display = 'inline';
        return false;
    }

    this.formElement.onclick = function() {
        window.currentUpdater = self;
    }



}

//sets the current object in the scope of the class
createElement.prototype.setMethod = function() {
    setCurrentUpdater(this);
}

createElement.prototype.testrij = function() {
    this.createMethod();
}

createElement.prototype.createMethod = function() {
    row = this.formElement.insertRow(0);
    cell = row.insertCell(0);
    cell.innerHTML = '&nbsp;';
}

createElement.prototype.splitCells = function() {
    this.createCells();
}

createElement.prototype.createCells = function() {
    len = this.formElement.rows.length;
    for (i=0;i< len;i++ ){
        cell = this.formElement.rows[i].insertCell(1);
        cell.innerHTML = '&nbsp;';
        cell.oncontextmenu = function() {
            showFormfields();
        }
    }
}

createElement.prototype.createRow = function() {
    alert(this.formElement);
}

createElement.prototype.howMany = function() {
    alert(this.formElement.rows.length);
}

Een naam voor een class kun je trouwens het beste kiezen door in te denken wat het voor moet stellen, niet wat het moet gaan doen. createElement is een handeling en geen echt object. ElementBuilder zou dus een betere naam zijn. Geeft aan wat het voor moet stellen, en daarmee gelijk ook wat het doet.

Noushka's Magnificent Dream | Unity


  • klapvee
  • Registratie: Mei 2004
  • Laatst online: 13-04-2022
Een hele goede reden voor mij is: het werkte :) en ik kom net om het hoekje kijken als het gaat
om classes,prototype, closure en polymorphism .. ik weet de manieren nu en wat ze doen
alleen het logische gedeelte erachter moet nog even komen

ik ga zo je code besturden, ik heb hier in ieder geval alweer een hoop van geleerd, dank je wel!
en wat die benaming betreft heb je gelijk hoor alleen was dit eigenlijk nog een test script
maar wel voor echte doeleinden.. dan ben ik wat makkelijker wat namen betreft :)
Pagina: 1