2017-08-21 2 views
0

En essayant de compléter un simple exercice node.js, j'ai essayé plusieurs variantes à ce sujet. Je soupçonne qu'il me manque quelque chose de très simple.erreur d'identificateur inattendue lors de la déclaration littérale d'objet

La raison pour laquelle j'ai créé var Calc était parce que je voulais exporter la fonction 'calculatrice'.

l'erreur:

/Users/alex/zdev/react-project/calc.js:4 
    var add = function(){ 
    ^^^ 

SyntaxError: Unexpected identifier 
calc.js fichier

: (fichier a été raccourci pour rester concis)

var readline = require('readline-sync'); 

var Calc = { 
     var add = function(){ 
       var num1 = readline.question("num1: "); 
       var num2 = readline.question("num2: "); 
       console.log(num1 + num2); 
     }; 
} 

module.export = Calc; 

fichier appelant:

var calc = require('./calc'); 

var Calc = new calc.Calc(); 

Calc.add(); 
Calc.sub(); 
Calc.divide(); 
+0

Est-ce que Calc devrait être un constructeur, à partir duquel vous pourriez instancier de nombreuses instances d'objets avec leurs propres données d'instance (ce qui n'est pas quelque chose que vous montrez comme étant nécessaire)? Ou devrait devrait 'Calc 'juste être un objet singleton avec quelques méthodes et vous ne devez pas instancier un séparément pour l'utiliser? – jfriend00

+0

Je crois que la deuxième utilisation si ce que je voulais. J'ai posté ma propre réponse à cette question ci-dessous. Ce qui donne ce que je voulais, malheureusement j'ai du mal à le décrire. –

+0

Quelqu'un peut-il suggérer un titre différent à cette question? Cela peut sembler basique, mais s'il est mieux étiqueté, cela pourrait être utile aux autres. –

Répondre

2

Vous définissez un nouvel objet Calc avec une fonction add, mais la syntaxe est incorrecte. La syntaxe correcte est:

var Calc = { 
    add: function() { 
    var num1 = readline.question("num1: "); 
    var num2 = readline.question("num2: "); 
    console.log(num1 + num2); 
    } 
}; 
+0

L'OP semble vouloir que 'Calc' soit un constructeur et' add' soit une méthode sur un objet instancié. Ce code fait de 'Calc' un singleton et' ajoute 'une méthode sur ce singleton, ce qui n'est pas la façon dont l'OP montre qu'il veut utiliser le code. – jfriend00

+1

@ jfriend00 Dans le code de l'OP 'Calc' est utilisé comme un singleton. Donc, ma réponse est à propos de comment déclarer un objet correctement. Les prototypes, etc., sont hors de la portée. – alexmac

+0

Je sais ce qu'est votre code. On ne sait pas ce que le PO veut. Leur code d'utilisation de 'Calc' le montre comme un constructeur qui n'est pas ce que cela crée, mais hélas leur code ne montre aucune utilisation de données d'instance donc peut-être qu'un singleton fonctionnerait très bien s'il changeait le code appelant. Qui sait? J'ai demandé au PO de clarifier dans un commentaire à leur question. – jfriend00

0

Si vous voulez faire fonction constructeur (je veux dire à partir de votre syntaxe) vous devriez le faire comme ceci:

function Calc() { 
} 

Calc.prototype.add = function() { 
    var num1 = readline.question("num1: "); 
    var num2 = readline.question("num2: "); 
    console.log(num1 + num2); 
}; 

module.exports = Calc; 

et vous importez cela comme:

var Calc = require('./calc'); 

var calc = new Calc(); 

calc.add(); 
calc.sub(); 
calc.divide(); 

Mais je préfère pour vous d'utiliser la syntaxe de classe ES6, et la fonction constructeur Calc ressemblera:

class Calc { 
    constructor() {} 

    add() { 
     var num1 = readline.question("num1: "); 
     var num2 = readline.question("num2: "); 
     console.log(num1 + num2); 
    } 
} 

module.exports = Calc; 
0
solution

est la suivante:

fichier d'appel

:

var calc = require('./calc'); 
var Calc = calc.Calc; 
Calc.add(); 

fichier calc:

var Calc = { 
     add: function(){ 
       var num1 = readline.question("num1: "); 
       var num2 = readline.question("num2: "); 
       console.log(num1 + num2); 
     }, 
     divide: function(){ 
       var num1 = readline.question("num1: "); 
       var num2 = readline.question("num2: "); 
       console.log(num1/num2); 
     }, 
     sub: function(){ 
       var num1 = readline.question("num1: "); 
       var num2 = readline.question("num2: "); 
       console.log(num1 - num2); 
     } 
} 

module.exports = {Calc:Calc} 

les lignes suivantes élongations sont où le mi original enjeux étaient les suivants:

définir ma classe après l'importation d'autres fonctions

Calc = calc.Calc; 

en utilisant des virgules pour séparer mes propriétés d'objet au lieu d'un point-virgule

}, 

ne pas définir un dictionnaire dans les exportations de module. Aussi, j'ai écrit 'module.export' non 'module.exports' origine

module.exports = {Calc:Calc} 

Et j'oublié de mettre mon parseInt() pour mes valeurs num1 et NUM2.

+0

Pourquoi ne pas simplement accepter la réponse de @alexmac. Il vous montre déjà cette syntaxe correcte pour déclarer un objet littéral avec des propriétés. – jfriend00

+0

Bien sûr si vous pensez que c'est la bonne chose à faire. Malheureusement après avoir regardé sa réponse j'étais toujours accroché sur la façon de faire correctement le module.exports. –

+1

Eh bien, la complication est que vous avez posé une question qui a omis beaucoup de détails. Vous avez montré une définition d'objet qui était une syntaxe invalide, puis montré une façon d'utiliser cet objet qui était incompatible avec ce que vous essayiez de faire et vous n'avez pas expliqué cet objectif réel ici. Donc, votre réponse a alors rempli tous les espaces dans la question qui est le mauvais endroit pour le faire. Ce que vous auriez dû faire, c'est éditer votre question pour décrire ce que vous essayez réellement d'accomplir (décrire l'objectif final de la façon dont vous voulez l'utiliser) et ensuite nous pourrions répondre à cette question plus complètement. – jfriend00