2009-12-03 8 views
0

Je voudrais savoir s'il est possible de faire quelque chose comme ceci:structures de données Javascript

if (mb == null || typeof (mb) != "object") { 
    var mb = new Object(); 
} 


mb = { 
    tests: { 
     onAnimals: { 
      test: function() { 
       return ""; 
      } 
     } 
     onHumans: { 
      test: function() { 
       return ""; 
      } 
     } 
    } 
} 

Bu quand je l'essaye, je peux voir Tests, mais quand je les points sur plus loin dans, je ne peux pas se surAnimals/onHumans.

javascript est encore nouveau pour moi, alors j'espère que vous pouvez aider.

Répondre

7

Il vous manque une virgule avant onHumans. J'ai supposé que mb était une variable globale; vous pouvez utiliser var à la place si c'est ce dont vous avez besoin. En outre, il est plus facile à lire si vous structurer différemment, comme ceci:

window.mb = window.mb || {}; 
window.mb = { 
    tests: { 
    onAnimals: { 
     test: function(){ 
     return ""; 
     } 
    }, 
    onHumans: { 
     test: function(){ 
     return ""; 
     } 
    } 
    } 
}; 
+1

À quoi sert la ligne supérieure? Vous réattribuez window.mb sur la deuxième ligne, ce qui annule entièrement la ligne du haut, à moins que je ne manque quelque chose. – Chris

+0

Vous avez raison; c'était juste une réplication du code OP. Typiquement, j'utiliserais cette première ligne, plus Object.extend (window.mb, {..def ...}), mais il n'y a aucune description de quelle bibliothèque, le cas échéant, est utilisée. – jvenema

1

Votre code est valable pour la plupart, et vous n'avez même pas faire le premier cas-contrôle. Il suffit de taper var mb = { ..., et vous allez commencer à définir mb à un nouvel objet, qu'il s'agisse d'un avant, ou undefined, ou autre chose ...

Ce qui vous manque est une virgule après la déclaration onAnimals tho :

mb = { 
    tests: { 
     onAnimals: { 
      test: function() { 
       return ""; 
      } 
     }, 
     onHumans: { 
      test: function() { 
       return ""; 
      } 
     } 
    } 
} 
1

Vous n'avez pas besoin de déclarer la variable en tant qu'objet auparavant, en utilisant simplement les crochets comme c'est tout ce dont vous avez besoin. Vous avez une erreur de syntaxe, il manque une virgule avant "onHumans", mais à part ça, ça me va bien. Vous devriez être en mesure d'atteindre les fonctions via mb.tests.onAnimals.test et mb.tests.onHumans.test

2

Il vous manque une virgule avant onHumans

if (mb == null || typeof (mb) != "object") { 
    var mb = new Object(); 
} 

mb = { 
    tests: { 
     onAnimals: { 
      test: function() { 
       return "animal"; 
      } 
     }, 
     onHumans: { 
      test: function() { 
       return "human"; 
      } 
     } 
    } 
} 

alert(mb); //[object Object] 
alert(mb.tests); //[object Object] 
alert(mb.tests.onAnimals); //[object Object] 
alert(mb.tests.onHumans); //[object Object] 
alert(mb.tests.onAnimals.test()); //animal 
alert(mb.tests.onHumans.test()); //human 
1

Comme il est indiqué dans certains des commentaires ci-dessus tests de l'existence des mb variables est redondante lorsque vous il suffit de le re-déclarer pour ajouter vos méthodes et propriétés.

Si vous testez l'existence de la variable pour ajouter des méthodes supplémentaires à l'objet, vous devez utiliser une méthode telle que extend de jQuery ou la méthode apply d'ExtJs.

jQuery:

window.mb = $.extend(window.mb||{}, { 
    tests: { 
     onAnimals: { 
      test: function() { 
       return ""; 
      } 
     }, 
     onHumans: { 
      test: function() { 
       return ""; 
     } 
    } 
}); 

Poste:

window.mb = Ext.apply(window.mb||{}, { 
    tests: { 
     onAnimals: { 
      test: function() { 
       return ""; 
      } 
     }, 
     onHumans: { 
      test: function() { 
       return ""; 
     } 
    } 
}); 

Ce bout de code sera soit ajouter des tests objet à la variable mb existante ou créer la variable mb puis ajoutez les tests de s'y opposer.