Dans ES6, les deux sont légaux:
var chopper = {
owner: 'Zed',
getOwner: function() { return this.owner; }
};
et, en sténographie:
var chopper = {
owner: 'Zed',
getOwner() { return this.owner; }
}
Est-il possible d'utiliser également les nouvelles fonctions fléchées? En essayant quelque chose comme
var chopper = {
owner: 'John',
getOwner: () => { return this.owner; }
};
ou
var chopper = {
owner: 'John',
getOwner: () => (this.owner)
};
Je reçois un message d'erreur suggérant que la méthode n'a pas accès à this
. S'agit-il simplement d'un problème de syntaxe ou ne pouvez-vous pas utiliser de méthodes fat-pipe à l'intérieur des objets ES6?
this
différemment. Il est défini par l'environnement lexical dans lequel la fonction a été créée, ce qui signifie que lathis
valeur où vous créez lachopper
variable sera lathis
valeur de la fonction. En d'autres termes, il ne fera pas référence à l'chopper
objet.this
valeur en créant d'abord l'chopper
objet, puis en effectuant l'affectation dans une fonction quithis
pointe vers cet objet. Cela peut être accompli assez proprement avec une fonction constructeur.console.log()
le résultat de l'appel de méthode. Ça marche.Réponses:
Les fonctions fléchées ne sont pas conçues pour être utilisées dans toutes les situations simplement comme une version abrégée de fonctions à l'ancienne. Ils ne visent pas à remplacer la syntaxe de fonction à l'aide du
function
mot - clé. Le cas d'utilisation le plus courant pour les fonctions fléchées est celui des "lambdas" courts qui ne se redéfinissent pasthis
, souvent utilisés lors du passage d'une fonction en tant que rappel à une fonction.Les fonctions fléchées ne peuvent pas être utilisées pour écrire des méthodes d'objet car, comme vous l'avez constaté, puisque les fonctions fléchées se ferment sur le
this
contexte englobant lexicalement,this
la flèche à l' intérieur de la flèche est celle qui était courante là où vous avez défini l'objet. C'est-à-dire:// Whatever `this` is here... var chopper = { owner: 'Zed', getOwner: () => { return this.owner; // ...is what `this` is here. } };
Dans votre cas, voulant écrire une méthode sur un objet, vous devez simplement utiliser la
function
syntaxe traditionnelle , ou la syntaxe de méthode introduite dans ES6:var chopper = { owner: 'Zed', getOwner: function() { return this.owner; } }; // or var chopper = { owner: 'Zed', getOwner() { return this.owner; } };
(Il existe de petites différences entre eux, mais elles ne sont importantes que si vous utilisez
super
ingetOwner
, ce que vous n'êtes pas, ou si vous copiezgetOwner
dans un autre objet.)Il y a eu un débat sur la liste de diffusion es6 à propos d'une torsion des fonctions fléchées qui ont une syntaxe similaire mais avec la leur
this
. Cependant, cette proposition a été mal accueillie car il ne s'agit que d'un simple sucre de syntaxe, permettant aux gens d'économiser quelques caractères et ne fournit aucune nouvelle fonctionnalité par rapport à la syntaxe de fonction existante. Consultez la rubrique Fonctions fléchées indépendantes .la source
Dans cette ligne
getOwner: => (this.owner)
devrait être:var chopper = { owner: 'John', getOwner: () => this.owner }; //here `this` refers to `window` object.
Vous devrez déclarer
this
dans une fonction:var chopper = { owner: 'John', getOwner() { return this.owner } };
Ou:
var chopperFn = function(){ this.setOwner = (name) => this.owner = name; Object.assign(this,{ owner: 'Jhon', getOwner: () => this.owner, }) } var chopper = new chopperFn(); console.log(chopper.getOwner()); chopper.setOwner('Spiderman'); console.log(chopper.getOwner());
la source
"TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
this
dans une fonction.this
ne fait pas nécessairement référence àwindow
. Il fait référence à la valeur actuelle dethis
dans l'environnement englobant, qui peut ou non êtrewindow
. C'est peut-être ce que vous vouliez dire. Je veux juste m'assurer qu'il comprend qu'il ne s'agit pas d'une valeur par défaut.this
fait maintenant référence à la classevar chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }
.Un petit conseil que je suis pour utiliser les fonctions fléchées.
object.method()
syntaxe. (Ce sont des fonctions qui recevront unethis
valeur significative de leur appelant.)la source
Cette fonction de flèche intérieure ne reflète pas le contexte de l'objet. Au lieu de cela, il donne le contexte dans lequel la méthode objet est appelée.
Vérifiez ceci, cela donne un aperçu de quand utiliser la flèche et quand non. https://dmitripavlutin.com/when-not-to-use-arrow-functions-in-javascript/
la source
Si vous devez utiliser la fonction flèche, vous pouvez passer
this
àchopper
,var chopper = { owner: "John", getOwner: () => chopper.owner };
Bien que ce ne soit pas la meilleure pratique, lorsque vous modifiez le nom de l'objet, vous devez modifier cette fonction de flèche.
la source
Une autre astuce, en mode strict,
this
fait toujours référence à Window au lieu d'indéfini.(() => { "use strict"; console.log(this); // window })(); (function () { "use strict"; console.log(this); // undefined })();
la source