2015-04-05 3 views
0

J'ai deux fichiers, un fichier principal et un fichier de module. Dans le fichier du module, j'exporte deux fonctions, qui renvoient des objets. Dans le fichier principal, je définis une variable à la valeur de retour de chaque méthode. Toutefois, chaque variable est définie sur la valeur de retour de la dernière méthode appelée. Qu'est-ce que je fais mal ici?L'affectation de plusieurs exportations nodejs renvoie des valeurs aux variables

/* main file */ 
module.exports = function(robot) { 
    var startingCharacter = require('./data/starting/character.json'), 
     make = require('./includes/make.js'); 

    return robot.respond(/dungeon me/i, function(msg) { 
    var character = startingCharacter, 
     weapon = make.weapon(0), 
     armor = make.armor(0); 

    console.log(weapon); // <- returns value from make.armor(0) 
    console.log(armor); // <- returns value from make.armor(0) 
    } 
}; 


/* module file */ 
var random = require('./random.js'); 

var baseStats = { 
    'equipped': 'true', 
    'attack': '0', 
    'damage': '0', 
    'defense': '0', 
    'health': '0', 
    'luck': '0', 
    'passivePower': {}, 
    'activePower': {} 
}; 

// Generate a weapon 
exports.weapon = function(level) { 
    var weaponNames = require('../data/nouns/weapon_names.json'); 
    var thisWeapon = {}; 

    if (level === 0) { 
    var adjNeg = require('../data/adjectives/negative.json'); 

    thisWeapon = baseStats; 
    thisWeapon.name = adjNeg[random(0, adjNeg.length)] + ' ' + weaponNames[random(0, weaponNames.length)]; 
    thisWeapon.type = 'weapon'; 
    } 

    console.log(thisWeapon); // <- returns correct value 
    return thisWeapon; 
}; 

// Generate armor 
exports.armor = function(level) { 
    var armorNames = require('../data/nouns/armor_names.json'); 
    var thisArmor = {}; 

    if (level === 0) { 
    var adjNeg = require('../data/adjectives/negative.json'), 
     animals = require('../data/nouns/animals.json'); 

    var armorName = armorNames[random(0, armorNames.length)]; 

    thisArmor = baseStats; 

    if (armorName === 'Hide') { 
     thisArmor.name = animals[random(0, animals.length)] + ' ' + armorName + ' armor'; 
    } 
    else { 
     thisArmor.name = adjNeg[random(0, adjNeg.length)] + ' ' + armorName; 
    } 
    thisArmor.type = 'armor'; 
    } 

    console.log(thisArmor); // <- returns correct value 
    return thisArmor; 
}; 

Note: éditée avec le code réel, au lieu de code exemple

+0

Le code tel qu'il a été posté comporte des erreurs - le code "method2" tel qu'écrit ici * déclare * "myObject1" mais * utilise * "myObject2". Quand c'est corrigé, le code fonctionne bien. – Pointy

+0

Pointy - Vous avez raison. J'ai préparé un exemple de code, pensant qu'il serait plus facile à regarder pour les gens, ce à quoi j'ai fait une erreur, et le corriger fonctionne. Je vais remplacer l'exemple de code par le code que j'utilise, qui a le comportement que j'ai décrit. – bronzehedwick

+0

OK, merci. Cela aide certainement. – Pointy

Répondre

1

Lorsque vous faites ceci:

thisArmor = baseStats; 

vous n'êtes pas faire une copie des "baseStats" objet. Comme les deux méthodes du module modifient et renvoient une référence à ce même objet, vous obtenez l'effet que vous observez.

Il existe plusieurs façons de mettre en œuvre une opération de copie superficielle pour le nœud; see this Stackoverflow question. Avec l'une de ces approches, vous démarrez ces méthodes avec une copie locale de "baseStats".

+0

Merci, ça l'a fait! – bronzehedwick