Prenons l'exemple suivant à partir de: http://www.phpied.com/3-ways-to-define-a-javascript-class/
var apple = { type: "macintosh", color: "red", getInfo: function () { return this.color + ' ' + this.type + ' apple'; } };
Maintenant, je déplace la méthode getInfo () en haut de la déclaration de mon objet.
var apple = { getInfo: function () { return this.color + ' ' + this.type + ' apple'; }, type: "macintosh", color: "red", }; apple.getInfo(); red macintosh apple
Je m'attendais à ce que l'analyseur / compilateur javascript échoue, puisque this.color et this.type ne sont pas encore définis. Comment cela fonctionne-t-il en interne?
(Cette question était à l'origine une question de cadre ExtJS ici: ExtJS: propriétés de paramètres via une fonction sur le prototype: est-ce un modèle sécurisé?, Mais j'ai compris qu'il s'agissait d'une question de javascript plus générale, donc celle-ci)
Le code à l'intérieur de la fonction n'est pas exécuté tant que vous ne l'appelez pas, et la color
de la propriété n'est pas évaluée jusqu'à apple.getInfo()
que apple.getInfo()
soit appelé.
Modifier:
var apple = { getInfo: function () { return this.color + ' ' + this.type + ' apple'; }, type: "macintosh", color: "red", } }
À ce moment, l'objet Apple est défini, et la propriété
getInfo
est une fonction qui renverra les propriétés “ lorsqu'il sera évalué
apple.getInfo();
La fonction est maintenant évaluée et la
color
et letype
propriétés ont déjà été définis à ce stade
La fonction obtient les valeurs de ces propriétés lorsqu'elles sont évaluées de sorte que si la color
et le type
propriétés sont modifiés, la valeur de retour de la fonction change également.
La fonction est appelée après avoir effectué l'instance. Lorsqu'il est défini, il n'est pas exécuté, ne tente pas d'accéder aux propriétés, mais où vous avez appelé la fonction getInfo()
, elles sont toutes présentes. En fait, il n'existe aucun moyen d'exécuter un code JavaScript personnalisé entre l'interprète en analysant les propriétés individuelles.
Je m'attendais à ce que l'analyseur / compilateur javascript échoue, puisque this.color et this.type ne sont pas encore définis.
L'analyseur dans le compilateur ne s'en préoccupe pas. JavaScript n'évalue pas si une propriété ou une variable peut être trouvée jusqu'à ce que le code qui l'utilise soit exécuté . Et dans le cas de propriétés, une propriété qui n'existe pas encore vient d'être créée (si vous l'écrivez) ou résulte dans la valeur undefined
(si vous en lisez), même si votre objet n'a pas été créé, T ont color
propriétés de color
et de type
, le code ne lirait toujours pas une erreur. Vous obtenez simplement la chaîne "undefined undefined apple"
.
Javascript: lors de l'utilisation de l'objet littéral, la commande des propriétés est-elle importante?
Des questions? Probablement pas. A-t-il un sens? Oui, à partir de ES6 (alias ECMAScript 6 alias ECMAScript 20150), la dernière spécification. L'ordre des propriétés dans un initialiseur d'objet détermine l'ordre dans lequel les propriétés sont créées, ce qui déclenche partiellement l'ordre dans lequel elles sont visitées par les boucles for-in
, l'ordre qu'elles apparaissent dans les tableaux Object.keys
, etc. (partiellement Parce que les noms de propriétés qui peuvent contraindre les nombres entiers sont traités différemment.) Mais il est rare que vous vous souciiez. Détails dans cette réponse et cette réponse (cette dernière concerne principalement des tableaux, mais touche également les objets non-tableau).