2010-07-19 17 views
4

Je viens de découvrir la façon dont les objets durs sont passés par référence en Javascript, par exemple:Faire objet passe pas par référence

for(var layer = 0; layer < hudLayers['layers'].length; layer++){ 

    // Store the to-be-calculated values in this object 
    var tempValues = hudLayers['layers'][layer]; 

    tempValues['name'] = 'test'; 
} 

Cela va changer la valeur tempValues ​​et hudLayers. (Cela semble un peu évident, mais un article sans un peu de code semble tellement nu.)

Y at-il un moyen rapide de contourner le problème?

+1

Vous souhaitez attribuer une valeur à 'tempValues' et ne l'ont pas reflété dans le' hudLayers'? Pourquoi voudrai-tu ceci? –

+0

Vous voulez vraiment savoir? :) 'hudLayers' contient plusieurs variables de largeurs et de hauteurs d'image. C'est un HUD, il doit donc être dessiné plusieurs fois par seconde. Ce qui est dans 'hudLayers' est en fait le « plan »(base de la largeur de cette image sur la valeur de cette variable, ...) Si j'écris simplement que revenir à plan' hudLayers'the est parti et l'image à l'écran restera toujours le même. – skerit

Répondre

6

Ce n'est pas un exemple de passage par référence (vous n'êtes pas de passage de paramètres). Cependant, vous avez raison; assigner un objet ne fera pas une copie profonde.

Vous pouvez faire une copie en profondeur d'un objet comme celui-ci:

function deepCopy(obj) { 
    if (typeof obj !== "object") return obj; 
    if (obj.constructor === RegExp) return obj; 

    var retVal = new obj.constructor(); 
    for (var key in obj) { 
     if (!obj.hasOwnProperty(key)) continue; 
     retVal[key] = deepCopy(obj[key]); 
    } 
    return retVal; 
} 

Notez que si le constructeur d'un objet a des effets secondaires, ce code va les déclencher.

-1

Faire une copie en profondeur d'un objet est aussi simple que objCopy = obj.toSource();.

.toSource on MDN

+1

Je pense que 'toSource' renvoie une représentation sous forme de chaîne. Pourrait mettre en place un cas de test? – kapa

0

Il n'y a pas passe par référence en JavaScript. Les objets sont accessibles par des références et ces références sont attribués ou transmis passés par valeur, comme en Java