Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[JavaScript] Object scope

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben al een hele tijd aan het zoeken hoe ik vanuit een 'function' binnen een 'method' een andere 'method' kan aanspreken binnen het object.

Eerst even een voorbeeld:

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
window.addEventListener('load', initialize, false);

function initialize() {

    new Example();
}

function Example() {

    this.action = function(message) {

        // Output
        alert(message);
    }

    this.method = function() {

        var Div  = document.createElement('div');
        var Text = document.createTextNode('Click me!');
        
        Div.appendChild(Text);
        Div.addEventListener('click', function(event) { this.action('It works!') }, false);
        
        document.body.appendChild(Div);
    }

    // Constructor
    this.method();
}


Ik krijg nu de error:
this.action is not a function (line 22)
Wat is de juiste manier om this.action(); aan te spreken zonder een 'global variable' aan te maken.

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Een closure maken:
JavaScript:
1
2
var self = this;
Div.addEventListener('click', function(event) { self.action('It works!') }, false);

of zorgen dat de handler in de juiste scope wordt uitgevoerd (ik gebruik prototype's bind hiervoor):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
Function.prototype.bind = function()
{
    var handler = this, args = [].slice.call(arguments, 0), object = args.shift();

    return function()
    {
        return handler.apply(object, args.concat([].slice.call(arguments, 0)));
    }
}

Div.addEventListener('click', function(event) { this.action('It works!') }.bind(this), false);

[ Voor 61% gewijzigd door crisp op 20-08-2007 13:37 ]

Intentionally left blank


Verwijderd

Topicstarter
crisp schreef op maandag 20 augustus 2007 @ 13:34:
Een closure maken:
JavaScript:
1
2
var self = this;
Div.addEventListener('click', function(event) { self.action('It works!') }, false);

of zorgen dat de handler in de juiste scope wordt uitgevoerd (ik gebruik prototype's bind hiervoor):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
Function.prototype.bind = function()
{
    var handler = this, args = [].slice.call(arguments, 0), object = args.shift();

    return function()
    {
        return handler.apply(object, args.concat([].slice.call(arguments, 0)));
    }
}

Div.addEventListener('click', function(event) { this.action('It works!') }.bind(this), false);
Ahh dat sommige dingen zo simpel kunnen zijn! Super bedankt _/-\o_

Verwijderd

Verwijderd schreef op maandag 20 augustus 2007 @ 13:39:
Ahh dat sommige dingen zo simpel kunnen zijn! Super bedankt _/-\o_
Simpel? Grapjas ;)

Verwijderd

Topicstarter
Dat eerste wat hij poste wel ;). Ik heb een vraagje over prototype. Ik wil een functie schrijven voor objecten.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Object.prototype.example = function() {

    for (item in this) {

        alert(item);
    }
}

var data = {

    'a': 'b',
    'c': {
        
        'd': 'e'
    }
}

data.example();


Als de functie 'example()' door het object 'this' heen loopt dan zie ik dat ik alle 'Object.prototype' functies ook terug krijg. Hoe kan ik er voor zorgen dat ik alleen het object terug krijgt waar ik de functie op uitvoer (in dit geval alles in 'var data').
a
c
example

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Zie: Object.prototype is verboten. Het betoog gaat er eigenlijk over dat je geen Object.prototype moet gebruiken, maar in het commentaar zie je ook oplossingen voor jou probleem. Volgens mij ben je namelijk op zoek naar: hasOwnProperty() ;)

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Verwijderd

Topicstarter
SKiLLa schreef op zaterdag 25 augustus 2007 @ 17:58:
Zie: Object.prototype is verboten. Het betoog gaat er eigenlijk over dat je geen Object.prototype moet gebruiken, maar in het commentaar zie je ook oplossingen voor jou probleem. Volgens mij ben je namelijk op zoek naar: hasOwnProperty() ;)
Werkt goed bedankt!

JavaScript:
1
2
3
4
5
6
7
8
9
10
Object.prototype.example = function() {

    for (item in this) {

        if (this.hasOwnProperty(item)) {

            alert(this[item]);
        }
    }
}

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Wat voor method noodzaakt het prototypen van Object? Really, het is bad practice...

Intentionally left blank

Pagina: 1