Maison > interface Web > js tutoriel > Puis-je remplacer « ceci » par le nom littéral d'objet dans les fonctions littérales d'objet JavaScript ?

Puis-je remplacer « ceci » par le nom littéral d'objet dans les fonctions littérales d'objet JavaScript ?

DDD
Libérer: 2024-11-29 01:02:16
original
613 Les gens l'ont consulté

Can I Replace 'this' with the Object Literal Name in JavaScript Object Literal Functions?

Ambiguïté dans les références de fonctions littérales d'objet : remplacement de « ceci » par un littéral d'objet

Une question importante se pose lorsque l'on travaille avec des littéraux d'objet : peut-on une fonction dans un objet fait référence à son objet parent en utilisant le nom du littéral au lieu de « ceci » ? Bien que cela semble fonctionner, cela peut entraîner des conséquences inattendues.

Considérez l'exemple suivant :

var obj = {
    key1: "it",
    key2: function() {return this.key1 + " works!"}
};
alert(obj.key2());
Copier après la connexion

Ce code déclenche une erreur de console car « ceci » dans la fonction key2 fait référence au global objet (fenêtre) au lieu de l'objet obj. Cette erreur peut être évitée en utilisant le littéral d'objet directement dans la fonction :

var obj = {
    key1: "it",
    key2: function() {return obj.key1 + " works!"}
};
alert(obj.key2());
Copier après la connexion

Cependant, même cette approche n'est pas à l'abri de problèmes. Analysons deux scénarios supplémentaires :

  1. Appels de fonctions externes :
var obj = {
    key1: "it",
    key2: function() { return this.key1 + " works!" }
};
var func = obj.key2;
alert(func()); // error
Copier après la connexion

Appel de la fonction key2 en tant que fonction autonome (et non en tant que méthode d'obj) rompt la référence 'this' et peut provoquer des erreurs inattendues résultats.

  1. Échange de référence :
var obj = {
    key1: "it",
    key2: function() { return obj.key1 + " works!" }
};
var newref = obj;
obj = { key1: "something else"; };
alert(newref.key2()); // "something else works"
Copier après la connexion

La modification de la référence obj à partir d'une référence secondaire peut invalider la référence interne de la fonction key2 à la bonne objet.

Pour répondre à ces problèmes potentiels, plusieurs solutions sont disponible :

  • ES6 avec const : Empêcher la mutation d'objet qui pourrait briser les références 'this'.
  • Fermeture ES5 : Encapsuler l'objet au sein d'une fonction pour éviter les collisions de références externes.
  • Liaison : Lier la fonction key2 sur l'objet obj pour garantir que sa référence « ceci » est toujours correcte.

Le choix de la solution la plus appropriée dépend du contexte spécifique et de la probabilité de rencontrer les problèmes décrits. Néanmoins, il est crucial d'être conscient des pièges potentiels et de prendre les précautions nécessaires lorsque vous travaillez avec des fonctions littérales d'objet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal