You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/10-bind/article-fr.md
+46-1Lines changed: 46 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -272,4 +272,49 @@ L'avantage de faire ça est que on peut créer une fonction indépendante avec u
272
272
273
273
Dans d'autres cas, les fonctions partielles sont utiles quand nous avons des fonctions vraiment génériques et que nous voulons une variante moins universelle pour des raisons pratiques.
274
274
275
-
Par exemple, nous avons une fonction `send(from, to, text)`. Alors, dans un objet `user` nous pourrions vouloir en utiliser une variante partielle : `sendTo(to, text)` qui envoie depuis l'utilisateur actuel.
275
+
Par exemple, nous avons une fonction `send(from, to, text)`. Alors, dans un objet `user` nous pourrions vouloir en utiliser une variante partielle : `sendTo(to, text)` qui envoie depuis l'utilisateur actuel.
276
+
277
+
## Aller dans les partielles sans contexte
278
+
279
+
Que se passe t-il si nous voulions corriger certains arguments, mais pas le contexte `this` ?
280
+
Par exemple, pour une méthode objet.
281
+
282
+
La fonction `bind` native ne permet pas ça. Nous ne pouvons pas juste omettre le contexte et aller directement aux arguments.
283
+
284
+
Heureusement, une fonction `partial` pour lié seulement les arguments peut être facilement implémentée.
285
+
286
+
Comme ça :
287
+
288
+
```js run
289
+
*!*
290
+
function partial(func, ...argsBound) {
291
+
return function(...args) { // (*)
292
+
return func.call(this, ...argsBound, ...args);
293
+
}
294
+
}
295
+
*/!*
296
+
297
+
// Utilisation :
298
+
let user = {
299
+
firstName: "John",
300
+
say(time, phrase) {
301
+
alert(`[${time}] ${this.firstName}: ${phrase}!`);
302
+
}
303
+
};
304
+
305
+
// Ajoute une méthode partielle avec time corrigé
306
+
user.sayNow = partial(user.say, new Date().getHours() + ':' + new Date().getMinutes());
307
+
308
+
user.sayNow("Hello");
309
+
// Quelque chose du genre :
310
+
// [10:00] John: Hello!
311
+
```
312
+
313
+
Le résultat de l'appel `partial(func[, arg1, arg2...])` est une enveloppe `(*)` qui appelle `func` avec :
314
+
- Le même `this` qu'il récupère (pour `user.sayNow` l'appel est `user`)
315
+
- Alors il donne `...argsBound` -- les arguments provenant de l'appel de `partial` (`"10:00"`)
316
+
- Alors il donne `...args` -- les arguments donnés à l'enveloppe (`"Hello"`)
317
+
318
+
Alors c'est simple à faire avec la spread syntaxe, pas vrai ?
319
+
320
+
Aussi il y une implémentation de [_.partial](https://lodash.com/docs#partial) prête à l'emploi dans les librairies lodash.
0 commit comments