2010-11-29 8 views
0

je suis un peu confus. Je veux créer un objet javascript comme:javascript problème d'objet

function myObject(){ 
this.keyOne=1; 
this.keyTwo=2; 
this.keyThree=3; 

function add(){ 
return this.keyOne+this.keyTwo+this.keyThree; 
} 

return{ 
    add: add 
} 

} 

créant ainsi cet objet avec

var newObject = new myObject(); 

fonctionne très bien et tous les attributs sont corrects. mais avec

var result = newObject.add; 

toutes les clés sont soudainement indéfinies! Je ne sais pas pourquoi? :/

Répondre

3

Vous n'êtes pas définir add() d'une manière qui est exposée, vous pouvez le faire par exemple:

function myObject(){ 
    this.keyOne=1; 
    this.keyTwo=2; 
    this.keyThree=3; 

    this.add = function(){ 
     return this.keyOne+this.keyTwo+this.keyThree; 
    } 
} 
var newObject = new myObject(); 
var result = newObject.add(); 

You can test it here.

Notez également que vous devez appeler add() avec des parenthèses, puisque c'est une fonction, ou vous obtiendrez la fonction elle-même, pas le résultat.

+0

mise en œuvre de cette façon que je reçois a "Le résultat de l'expression 'myObject.add' [indéfini] n'est pas une fonction."; – mkind

+0

@mkind - l'avez-vous * exactement * comme je l'ai ci-dessus? Vous pouvez voir à partir de la démo comment cela fonctionne ... votre version diffère probablement de la réponse, revérifier :) –

+0

que la création et l'appel se produisent dans un autre fichier js ne devrait pas être un problème si elle est incluse correctement, à droite ? – mkind

3

Il n'y a actuellement aucune signification pour le mot-clé public en JavaScript standard.

Sur la base de l'extrait de code original, je suppose que vous vouliez dire:

function myObject(){ 
    this.keyOne=1; 
    this.keyTwo=2; 
    this.keyThree=3; 

    function add(){ 
     return this.keyOne+this.keyTwo+this.keyThree; 
    } 

    return { 
     add: add 
    }; 
} 

La fonction serait alors renvoyer un objet qui a une seule propriété: la fonction add. Cet objet est créé par le littéral d'objet après le mot-clé return.

Mais alors, il est inutile d'utiliser this. Vous auriez pu écrire:

function myObject() { 

    var keyOne=1; 
    var keyTwo=2; 
    var keyThree=3; 

    function add() { 
     return keyOne + keyTwo + keyThree; 
    } 

    return { 
     add: add 
    }; 
} 

Ou encore plus succinctement:

function myObject() { 

    var keyOne=1; 
    var keyTwo=2; 
    var keyThree=3; 

    return { 
     add: function() { 
      return keyOne + keyTwo + keyThree; 
     } 
    }; 
} 

Ceci a l'avantage supplémentaire que vous ne avez pas besoin de l'appeler préfixé avec new. Il est juste une fonction ordinaire qui crée et retourne un objet qui contient une autre fonction:

var o = myObject(); 
alert(o.add()); 

Vous pouvez permettre à l'appelant de spécifier les numéros à ajouter, comme ceci:

function myObject(keyOne, keyTwo, keyThree) { 

    return { 
     add: function() { 
      return keyOne + keyTwo + keyThree; 
     } 
    }; 
} 

var o = myObject(5, 4, 7); 
alert(o.add()); 
+0

merci .. le "public" est juste une faute d'orthographe. je l'ai changé ci-dessus – mkind