209 votes

Pourquoi et comment fait ' un ' [' toUpperCase '] () dans le travail de JavaScript ?

JavaScript continue de me surprendre et c'est un autre exemple. Je viens de tomber sur un code que je n'ai pas compris à la première. Donc j'ai débogué il et venu à cette conclusion:

alert('a'['toUpperCase']());  //alerts 'A'

Maintenant, cela doit être évident, si l' toUpperCase() est défini comme un membre de type chaîne de caractères, mais il n'a pas de sens pour moi d'abord.

De toute façon,

  • cela fonctionne parce que l' toUpperCase est un membre de "a"? Ou il y a quelque chose d'autre se passe derrière les coulisses?
  • le code que j'ai lu a une fonction, comme suit:

    function callMethod(method) {
        return function (obj) {
            return obj[method](); //**how can I be sure method will always be a member of obj**
        }
    }
    
    var caps2 = map(['a', 'b', 'c'], callMethod('toUpperCase')); // ['A','B','C'] 
    // ignoring details of map() function which essentially calls methods on every 
    // element of the array and forms another array of result and returns it
    

    Elle est un peu générique de la fonction à appeler TOUTES les méthodes sur TOUT objet. De là à dire que la méthode spécifiée sera déjà implicite membre de l'objet spécifié?

Je suis sûr que je suis absent de certains graves compréhension du concept de base des fonctions JavaScript. Merci de m'aider à comprendre cela.

293voto

jAndy Points 93076

Pour le décomposer.

  • .toUpperCase() est une méthode de String.prototype
  • 'a' est une valeur primitive, mais est converti dans sa représentation d'Objet
  • Nous avons deux notations pour accéder aux propriétés de l'objet, les méthodes, la dot et le support de la notation

Donc

'a'['toUpperCase'];

est l'accès via le support de la notation sur la propriété toUpperCase, à partir de String.prototype. Depuis cette propriété fait référence à une méthode, on peut invoquer en attachant ()

'a'['toUpperCase']();

78voto

ThiefMaster Points 135805

foo.bar et foo['bar'] sont égaux donc le code que vous avez posté est le même que

alert('a'.toUpperCase())

Lors de l'utilisation d' foo[bar] (à noter que l'absence de guillemets) vous n'utilisez pas le nom littéral bar mais quelle que soit la valeur de la variable bar contient. Donc, en utilisant l' foo[] de la notation au lieu de foo. vous permet d'utiliser une propriété dynamique nom.


Jetons un coup d'oeil à l' callMethod:

Tout d'abord, il retourne une fonction qui prend en obj comme argument. Lorsque cette fonction est exécutée, elle appellera method sur cet objet. Donc, la méthode donnée juste besoin d'exister, soit sur l' obj lui-même ou quelque part sur son prototype de la chaîne.

Dans le cas d' toUpperCase cette méthode vient de l' String.prototype.toUpperCase - il serait assez stupide pour avoir une copie distincte de la méthode pour chaque chaîne unique qui existe.

25voto

Artyom Neustroev Points 4394

Vous pouvez soit accéder aux membres de n’importe quel objet avec notation ou notation. C’est la caractéristique du langage JavaScript. Pour être sûr que les membres sont dans l’objet, il suffit de cocher, si elle est définie :

17voto

Nisk Points 354

Fondamentalement javascript traite tout comme un objet, ou plutôt chaque objet peut être considéré comme un dictionnaire /-tableau associatif. Et fonctions/méthodes sont définis exactement la même manière pour l’objet - comme une entrée dans ce tableau associatif.

Donc, essentiellement, vous êtes référencement/calling (Notez le «()») la propriété « toUpperCase », de « a » l’objet (qui est un type de chaîne, dans ce cas).

Voici un code du haut de ma tête :

10voto

dystroy Points 145126

anyObject['anyPropertyName'] est le même que anyObject.anyPropertyName lorsque anyPropertyName n'a pas problématique caractères.

Voir Travailler avec des Objets, de la MDN.

L' toUpperCase méthode est attachée au type de Chaîne. Lorsque vous appelez une fonction sur une valeur primitive, ici 'a', il est automatiquement promu à un objet, ici une Chaîne de caractères :

Dans les contextes où une méthode est invoquée sur une primitive de chaîne ou d'une recherche de propriété se produit, JavaScript, automatiquement automatiquement la chaîne primitive et l'appel à la méthode ou à exécuter la recherche de propriété.

Vous pouvez voir la fonction existe en vous connectant String.prototype.toUpperCase.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X