2012-05-05 5 views
0

Dans un programme, je vous écris i besoin d'une variable objet qui ressemble à ceci:variable de changement Javascript en fonction de référence variable

var map { 
    cube: {__pt3arraylocation__:[0,0,0], poly: new Object()}, 
    other: {__pt3arraylocation__:[1,0,0], poly: new Object()} 
}; 

Cependant, je veux être en mesure de taper map.cube et avoir le retour de la pt3arraylocation par défaut à moins que je précise ce que je veux en tapant map.cube.poly

par exemple: map.cube retournerait [0,0,0] et map.cube.poly retournerait l'objet poly dans le cube d'objet

merci dans avancer

Répondre

3

je veux être en mesure de taper map.cube et avoir le retour pt3arraylocation par défaut à moins que je précise ce que je veux en tapant map.cube.poly

par exemple: map.cube serait return [0,0,0] et map.cube.poly renvoient l'objet poly dans le cube objet

Vous ne pouvez pas faire cela en JavaScript.

Cependant, en guise d'alternative, il est intéressant de noter que vous pouvez ajouter des propriétés arbitraires aux tableaux si vous le souhaitez. Ainsi, par exemple:

var map { 
    cube: [0,0,0], 
    other: [1,0,0] 
}; 
map.cube.poly = {}; // {} is the same as `new Object()` but not subject to people... 
map.other.poly = {}; // ...overriding the `Object` symbol 

Alors map.cube vous donne le tableau, et map.cube.poly vous donne l'objet que vous avez enregistré sur ce tableau.

Comment est-ce possible? Parce que dans JavaScript, arrays aren't really arrays. Ce ne sont que des objets qui ont une propriété automatique length, traitent une classe de noms de propriété (tous numériques) d'une manière spéciale, et ont Array.prototype les sauvegarder. Et bien sûr, vous pouvez ajouter des propriétés à n'importe quel objet.

Il n'y a pas de syntaxe littérale pour ce faire, c'est pourquoi je devais le faire avec des affectations après l'initialiseur d'objet ci-dessus. Mais c'est parfaitement valide. Je l'utilise pour les tableaux à indexation croisée tout le temps.

Assurez-vous, si vous faites cela, que vous n'utilisez pas correctement for..in; more.

+0

grâce, fonctionne parfaitement –

1

La meilleure façon de le faire, je dirais est comme ceci:

var map { 
    cube: [0,0,0], 
    other: [1,0,0] 
}; 
map.cube.poly = new Object(); 
map.other.poly = new Object(); 
0

Ce n'est pas possible de achive. Peut-être que vous pouvez jouer avec toString()

var map = { 
    cube: { 
     __pt3arraylocation__:[0,0,0], 
     poly: new Object(), 
     toString : function() { 
     return this.__pt3arraylocation__.toString() 
     } 
    }, 
    other: {__pt3arraylocation__:[1,0,0], poly: new Object()} 
}; 

map.cube == '0,0,0' 
map.cube.split(',') == map.cube.__pt3arraylocation__ 
0

Il n'y a aucun moyen de faire exactement comme vous voulez - si vous demandez un objet (qui est map.cube), vous obtenez un objet. Cependant, il y a plusieurs façons de faire quelque chose de similaire.

  • lorsqu'il est utilisé en tant que paramètre à des fonctions ou des opérations qui nécessitent une chaîne de caractères, comme alert(map.cube) ou "sometext" + map.cube, l'objet est converti en chaîne en appelant la fonction toString.Vous pouvez donc définir, par exemple:

    map.cube.toString = function() { return this.__pt3arraylocation__.toString(); }; 
    
  • une chose semblable se produit quand il y a si l'objet est utilisé dans le contexte lorsqu'un numéro est nécessaire. Dans ce cas, il est converti avec valueOf(). Vous pouvez donc utiliser, par exemple

    map.cube.valueOf = function() { return this.__pt3arraylocation__.length; }; 
    
  • ou vous pouvez obtenir la valeur par défaut via un appel de fonction, si vous définissez votre objet en fonction au lieu

    var map = { 
        cube: function() { 
         return map.cube.__pt3arraylocation__; 
        } 
    } 
    
    map.cube.__pt3arraylocation__ = [0,0,0]; 
    map.cube.poly = new Object(); 
    
    alert(map.cube.__pt3arraylocation__); // 0,0,0 
    alert(map.cube.poly);     // [object Object] 
    alert(map.cube());     // same as map.cube.__pt3arraylocation__ 
    

    Comme vous pouvez le voir, en JavaScript , les fonctions sont des objets comme les autres, donc vous pouvez non seulement les appeler, mais aussi leur donner des champs et des méthodes.

0

T.J. Crowder est droite. Sur la base de sa réponse que je voudrais faire remarquer que vous pouvez également assigner map.cube comme ce

var map = { 
      cube: function(){ 
        var val = [0,0,0]; 
        val.poly = {}; 
        return val; }() 
      }; 

Ou pour plusieurs valeurs:

function polyval(val){ 
    val.poly = {}; 
    return val; 
} 
var map = { 
      cube: polyval([0,0,0]), 
      other: polyval([1,0,0]), 
      more: polyval([1,1,0]) 
      /* ... etc */ 
}; 
Questions connexes