1
votes

Paramètres de fonction JavaScript et méthodes d'objets

Quelqu'un peut-il m'expliquer la différence entre quand utiliser une fonction en introduisant vos variables entre parenthèses, et quand placer la fonction après la variable avec un point, comme utiliser la fonction toString ()?

exemple code

var num = 1;
num.addMe();

Je ne sais pas vraiment si ma syntaxe est correcte, mais je veux savoir quand alimenter une variable en paramètre, comme comment je nourris la variable num, à la fonction addMe. Et quand utiliser la fonction .toString () en mettant un point après la variable et en tapant la fonction.

Aurais-je pu faire quelque chose comme ça - à condition d'avoir construit ma fonction correctement?

function addMe(a){
a = a+1;
return a;
}
var num = 1;
addMe(num);
num.toString();

Merci pour l'aide!


4 commentaires

L'un est une fonction, l'autre est une méthode. Les méthodes sont des fonctions d'un objet, héritées sous ce que l'on appelle héritage prototypique . Voir aussi Fonctions vs méthodes


"Je ne sais pas vraiment si ma syntaxe est correcte" Avez-vous essayé d'exécuter votre code. Vous pourrez poser une meilleure question si vous essayez d'abord de comprendre le concept que vous posez. Si vous l'exécutez à partir d'un navigateur, vous obtiendrez de bonnes informations dans le journal de la console.


Jetez un œil à developer.mozilla.org/en-US/ docs / Web / JavaScript / Guide /…


Utkonos votre article était parfait, je ne savais même pas quoi chercher merci cela répond à ma question


3 Réponses :


3
votes

Le premier est utilisé pour les fonctions «autonomes» simples, tandis que le second est utilisé pour les méthodes objet. Par exemple, un objet numérique a par défaut une méthode toString (). Certaines méthodes objet peuvent également exiger que des paramètres soient passés entre les parenthèses.


0 commentaires

0
votes

Les variables (une déclaration de fonction est juste une fonction stockée dans une variable) sont recherchées dans la chaîne de portées (remontant à la portée externe suivante jusqu'à ce qu'une variable avec le nom soit trouvée):

num = addMe(num);

Les propriétés d'un objet sont recherchées dans la chaîne de prototypes d'objets, donc si vous faites

function addMe(a){
 a = a+1;
 console.log(a); // 2
 return a;
}

var num = 1;
addMe(num);
console.log(num); // 1 ... ?

alors a est recherché dans les portées comme expliqué ci-dessus, alors b est accédé sur l'objet résultant (tout est un objet en JavaScript, sauf pour "rien" ( undefined , null )) en recherchant la chaîne de prototypes. Pour un objet simple, la chaîne est assez courte:

 1..whereDoIComeFrom()

Ici b sera trouvé dans l'objet lui-même. Cependant, tous les objets héritent de l'objet Object.prototype , donc si vous ajoutez une propriété à cela (veuillez ne pas le faire):

Number.prototype.addMe = function() {
 console.log(this);
};

// two dots are needed to distinguish it from numbers with a fraction (e.g. 1.2)
1..addMe();

vous pouvez puis recherchez-le sur chaque objet, car la recherche traverse la chaîne de prototypes et atteint Object.prototype:

 console.log({}.test); // 1

Maintenant pour les nombres (comme dans votre cas), ils héritent du Number.prototype donc vous pouvez faire:

 Object.prototype.test = 1;

Cela dit, maintenant addMe peut être appelé sur chaque numéro, partout dans votre code. Bien que cela puisse sembler utile, c'est en fait une douleur car vous ne savez pas où une certaine méthode a été ajoutée

 const a = { b: 1 }; // object -> Object.prototype

qui rend le code illisible et non structuré. Au lieu de cela, si vous avez besoin d'une certaine fonctionnalité plusieurs fois, résumez-la dans une fonction, ne touchez pas aux prototypes natifs.


Je suppose que addMe n'est qu'un exemple simplifié , si ce n'est pas le cas, continuez à lire:

Si vous passez un argument à une fonction en JavaScript, la valeur sera copiée (c'est un peu plus compliqué avec les non primitives (tout sauf les nombres, les booléens, etc.) .)) dans la variable de paramètre de la fonction appelée ainsi ici:

a.b

vous avez en fait deux variables ( a et num code>), changer a ne change pas num . Mais lorsque vous retournez a vous pouvez faire:

 let a = 1; // outer scope

 { // inner scope
   console.log(a); // looked up in "inner scope", than "outer scope"
}

qui copie la valeur de num dans a , puis augmente a de un, puis recopie la valeur de a dans num.


6 commentaires

"une fonction est juste une variable aussi" discutable;) Je sais ce que vous essayez de dire, mais une fonction en elle-même est une valeur. Une variable est un conteneur pour une valeur.


Tout en JavaScript n'est pas un objet. undefined , null , les nombres, les chaînes et les booléens ne sont pas des objets. typeof null === 'object' n'est qu'une bizarrerie. les nombres, les chaînes et les booléens peuvent être implicitement convertis en objets Number , String ou Boolean , mais null et undefined ne sont jamais des objets et n'ont aucun équivalent objet.


@paulpro car les primitives sont "boxées" (oui, pas un terme JS) Je pense que c'est une simplification raisonnable


Oui, mais si l'on pense que les nombres et les chaînes sont des objets, il peut être très confus quand il essaie de faire quelque chose comme var x = 5; x.foo = 'bar'; console.log (x.foo); un jour.


@paulpro oui, nous pourrions écrire un autre livre expliquant chaque partie de JS juste pour répondre à cette question sans omettre de détails. J'ai essayé de répondre suffisamment pour donner au PO un point de départ pour la recherche et l'expérimentation


Je ne dis pas d'entrer plus en détail; Je dis que vous en avez déjà trop. Je ne vois tout simplement pas l'intérêt de dire "tout est JavaScript est un objet". C'est une fausse déclaration et même si c'était vrai, cela n'ajoute rien à votre réponse.



0
votes

Lorsque vous avez fait var num = 1 , vous avez créé un objet JavaScript. Cela ressemble à un nombre mais vous pouvez considérer tout dans JavaScript comme un objet (simplification) et tous ces objets ont des caractéristiques différentes. Ainsi, un nombre a certaines fonctionnalités, une chaîne a d'autres fonctionnalités, etc.

Vous avez mentionné une fonctionnalité: toString . Une autre fonctionnalité serait toLowerCase.

toString et toLowerCase sont des fonctions fournies avec JavaScript. Ces fonctions sont ensuite "placées" sur tous ces objets pour que nous les utilisions.

Je peux avoir une variable de type chaîne comme

function addMe(number) {
  return number+1 
}

const answer = addMe(1) //2

Ce code fonctionnera car il a été décidé que la fonction toLowerCase devrait fonctionner sur les chaînes

Je peux aussi avoir un tableau (liste d'éléments) p>

const list = ['A', 'B', 'C']

const answer = list.toLowerCase()
console.log(answer)

Mais ce code ne fonctionnera pas car toLowerCase ne fonctionne pas sur les tableaux. Donc, vous obtenez le message d'erreur suivant: list.toLowerCase n'est pas une fonction .

Fondamentalement, il dit: Je ne sais pas ce que toLowerCase signifie lorsqu'il est utilisé sur cette variable de liste (tableau ).

En JavaScript, cela s'appelle des prototypes. Le prototype est un moyen pour JavaScript d'obtenir des fonctionnalités d'un autre. En gros: j'ai toutes sortes de fonctions, quel objet peut utiliser quelles fonctions. C'est ce qu'on appelle la chaîne de prototypes.

Dans les deux cas, vous utilisez une fonction. addMe est une fonction que vous avez créée et toString est une fonction en JavaScript qui a été placée sur des objets via cette chaîne de prototypes.

Je ne sais pas vraiment si ma syntaxe est correcte

Oui, votre syntaxe est correcte. Votre fonction addMe est le moyen standard de créer une fonction en JavaScript.

Mais je veux savoir quand alimenter une variable en tant que paramètre, comme comment je donnez la variable num à la fonction addMe.

Tout comme vous l'avez fait, vous définissez une fonction et des paramètres comme vous l'avez fait.

..et quand utiliser la fonction .toString () en mettant un point après la variable et en tapant la fonction.

Lorsque vous voulez placer votre fonction sur un objet afin que toutes les instances de cet objet puissent vous cet objet.

Dans la plupart des cas, surtout lorsque vous débutez. Vous n'avez pas à vous soucier de ces prototypes. Comme vous l'avez fait.

var text = 'MY TEXT'
var lowercaseText = text.toLowerCase()
console.log(lowercaseText) // my text

Est une manière standard de définir une fonction et de l'appeler.


0 commentaires