2009-09-08 10 views
1

donc j'ai une définition d'objet qui ressemble à ceci:propriétés de l'objet d'accès dans la définition de l'objet

var Foo = window.Foo = { 
    MIN_ROWS : 10, 
    MIN_COLS : 10, 

    NUM_ROWS : (function(){ return Math.max(parseInt(this.params.rows) || 0, this.MIN_ROWS); })(), 

    // etc... 

    params: (function(){ /* ... */ })() // parses the GET querystring parameters from the URL and returns as a JSON object 

} 

Pour la propriété NUM_ROWS, je veux le mettre comme Foo.params.rows si elle existe et il est supérieur à MIN_ROWS, sinon réglez-le sur MIN_ROWS.

Je l'ai déjà compris la logique pour cela, la seule chose qui me donne du mal est quand je auto-appeler la fonction comme ci-dessus, la variable this fait référence à window et non à Foo que j'attendre à. (Ceci est le message d'erreur que je reçois dans la console: "TypeError: Result of expression 'this.params' [undefined] is not an object.")

Si je n'invoque pas la fonction elle-même, cela fonctionne parfaitement. Cependant, je voudrais avoir NUM_ROWS être un nombre entier, pas une fonction, de sorte que je peux y accéder comme Foo.NUM_ROWS et non Foo.NUM_ROWS() dans les autres parties de mon code.

Quelqu'un peut-il m'aider s'il vous plaît?

+0

Pour ceux qui conseillent la définition 'params 'avant' NUM_ROWS': je ne pense pas que cela compte. J'ai essayé de déplacer 'params' au dessus de' NUM_ROWS' et j'ai toujours le même message d'erreur. Cette erreur indique que "this.params" [undefined] n'est pas un objet, mais dans ce contexte, le "this" fait référence à l'objet "window" global, pas à l'objet "Foo", comme découvert en insérant 'console.log (this)' au début de ma fonction 'NUM_ROWS'. – gabriel

+0

réponse mise à jour ...en fait, il est tout à fait logique que ce soit window, car il est toujours dans les fonctions appelées fonctions, au lieu d'être appelé comme méthodes ... – back2dos

+0

@gabriel, j'ai jeté un coup d'oeil à ceci, et j'ai changé mon post, vous avez probablement ça a été trié. Cela faisait un moment que je regardais js sans utiliser un framework, donc vous pouvez probablement l'avoir mieux que mon exemple mais j'espère qu'il résout les problèmes que vous aviez avec le mot clé this. –

Répondre

1

Voici comment je l'ai réparé, j'ai un peu simplifié le code, mais vous devriez avoir l'idée, si ce n'est déjà fait, espérer que ça aide. Le lien ci-dessous vaut vraiment la peine d'être suivi si vous voulez obtenir votre javascript cloué.

var FooFactory = function(){ 
    this.MIN_ROWS = 10; 
    this.MIN_COLS = 10; 
    this.params = { rows : 12}; 

    this.NUM_ROWS = Math.max(parseInt(this.params.rows) || 0, this.MIN_ROWS); 
    // etc... 
}; 
var Foo = window.Foo = new FooFactory(); 

document.write(Foo.NUM_ROWS); 

cette JavaScript est l'objet qui appelle, pas l'objet appelé, vous devez regarder sur le site de Doug Crockford pour obtenir quelques bons articles sur ce que cela signifie, et comment il affecte votre utilisation dans ce Cas.

This article en particulier vous montre ce que cela est tout au sujet

0

pourquoi ne pas initialiser params avant NUM_ROWS? params est pas encore disponible au moment ...

autre que cela, vous voudrez peut-être déclarer un getter ...


modifier: bien, dans ce cas, un getter est vraiment un bonne option ... ne fonctionnera pas à bien dans IE mais ... en dehors de cela, vous pouvez toujours construire l'étape d'objet par étape ...

var Foo = window.Foo = { 
    MIN_ROWS : 10, 
    MIN_COLS : 10 
} 
Foo.params = //parse input 
Foo.NUM_ROWS = Math.max(parseInt(Foo.params.rows) || 0, Foo.MIN_ROWS)); 

ou peut-être de cette façon:

var params = //parse input 
var NUM_ROWS = Math.max(parseInt(params.rows) || 0, this.MIN_ROWS)); 
var Foo = window.Foo = { 
    MIN_ROWS : 10, 
    MIN_COLS : 10 
    params: params, 
    NUM_ROWS: NUM_ROWS 
} 

oui, ce n'est pas si funky que ce que vous avez essayé d'utiliser, mais cela fonctionne tout simplement ... plus il vous permet d'économiser au moins un appel ...


+0

Merci pour la réponse, mais malheureusement, cela ne semble rien résoudre. S'il vous plaît voir mon commentaire ci-dessus. – gabriel

Questions connexes