IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Compréhention du Polyfill de bind


Sujet :

JavaScript

  1. #1
    Membre du Club
    Homme Profil pro
    aucun
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 42
    Points
    42
    Par défaut Compréhention du Polyfill de bind
    Voici un petit polyfill de la fonction bind.
    Le "this" de la fonction fait référence à l'objet qui appelle la fonction bind non ? Alors pourquoi à la 5 eme ligne nous avons fn.apply(scope); ? fn et l'objet et non une fonction non ? Merci de m'éclairé sur ce point.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Function.prototype.bind = function (scope) {
        var fn = this;
        return function () {
            return fn.apply(scope);
        };
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    La fonction bind est une fonction de l'objet... Function ! Donc fn est un objet de type Function. Eh oui, en JavaScript, les fonctions sont des objets.

    Note: ce polyfill ne respecte pas strictement la fonction native Function.prototype.bind. Voilà un polyfill plus "béton" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    if (!Function.prototype.bind) {  Function.prototype.bind = function (oThis) {
        if (typeof this !== "function") {
          // closest thing possible to the ECMAScript 5
          // internal IsCallable function
          throw new TypeError("Function.prototype.bind - 
               what is trying to be bound is not callable");
        }
     
        var aArgs = Array.prototype.slice.call(arguments, 1), 
            fToBind = this, 
            fNOP = function () {},
            fBound = function () {
              return fToBind.apply(this instanceof fNOP && oThis
                     ? this
                     : oThis,
                     aArgs.concat(Array.prototype.slice.call(arguments)));
            };
     
        fNOP.prototype = this.prototype;
        fBound.prototype = new fNOP();
     
        return fBound;
      };
    }
    One Web to rule them all

  3. #3
    Membre du Club
    Homme Profil pro
    aucun
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Merci donc je doit prendre les fonctions comme étant des objets à part entière alors ?

    Petit exemple rapide pour savoir si j'ai bien compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function.prototype.appel = function(){ 
         console.log(this);
    }
     
    var foo = {
    a : function(){
    console.log(this);
         }
    };
     
    foo.a()         // this = foo
    foo.a.appel() // this = a ?

    Pardon pour l'erreur sur le titre du topic.

  4. #4
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    non dans le dernier cas c'est appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foo.a.appel() // this = appel
    car appel est une fonction et que tu agit sur le prototype des fonction
    A+JYT

  5. #5
    Membre du Club
    Homme Profil pro
    aucun
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Je me suis trompé alors comment avoir la fonction a alors ?

  6. #6
    Membre du Club
    Homme Profil pro
    aucun
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Désolé pour le double post mais j'ai fait de petite modification les voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function.prototype.appel = function(){ 
         console.log(this+"Fonction appel");
    }
     
    var foo = {
    a : function(){
    console.log(this+"Fonction A");
         }
    };
     
    foo.a() // "[object Object]Fonction A " <- ce qui est retourné
    foo.a.appel() // "function (){console.log(this+"Fonction A");}Fonction appel " <- ce qui est retourné

    Pourquoi dans le second cas c'est le contenu de la fonction "a" qui est retourné ?

  7. #7
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Dans le premier cas, a est une fonction de l'objet foo donc this correspond à foo, de type Object. Le cast en String d'un Object est "[object Object]".

    Dans le second cas, appel est une fonction de l'objet a donc this correspond à a, de type Function. Le cast d'une fonction en String correspond à la déclaration de cette fonction.

    Les objets sont cast en String à cause de l'opérateur de concaténation "+". Essaie avec console.log("Fonction appel", this);, tu verras mieux.

    @sekaijin: le fait que la fonction soit dans le prototype ou l'objet lui même ne change pas l'attribution du contexte à l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String.prototype.test = function(){ return ">>> "+this; }; "toto".test(); // ">>> toto"
    One Web to rule them all

  8. #8
    Membre du Club
    Homme Profil pro
    aucun
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Oui merci j'obtient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foo.a()
    Object {a: function} "Fonction A" VM3708:8
    undefined
    foo.a.appel()
    function (){
    console.log(this,"Fonction A");
         } "Fonction appel" VM3708:3
    undefined
    Mais le this de foo.a.appel() n'est pas la fonction 'a' je ne comprend pas, pourquoi ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Ben si ça l'est.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function.prototype.appel = function(){      console.log("J'appelle la fonction appel");
         console.log(this);
    }
     
    var foo = {
      a : function(){
         console.log("Je suis la fonction A");
      }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foo.a.appel();
    > J'appelle la fonction appel VM749:3
    > function (){
         console.log("Je suis la fonction A");
      }
    One Web to rule them all

  10. #10
    Membre du Club
    Homme Profil pro
    aucun
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 42
    Points
    42
    Par défaut
    Ahh c'etait donc bien ça car sekaijin m'as répondu que ce n’était pas 'a' mais plutôt 'appel', j'ai peut-être mal expliqué mon problème donc c'est bien la fonction 'a' que le 'this' de la fonction 'appel' fait référence, merci de t'as réponse SylvainPV sa faisait plusieurs temps que je cherchais à comprendre ceci.

    Merci je passe le sujet en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. traquer des requêtes non bindées
    Par aline dans le forum Oracle
    Réponses: 3
    Dernier message: 14/03/2005, 11h56
  2. Récupérer l'adresse de bind d'un socket
    Par gloode dans le forum Réseau
    Réponses: 4
    Dernier message: 04/02/2005, 10h56
  3. Bind ou pas Bind?
    Par jonzuzu dans le forum MFC
    Réponses: 4
    Dernier message: 19/03/2004, 10h00
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Bind - sous-domaine
    Par _Gabriel_ dans le forum Réseau
    Réponses: 4
    Dernier message: 07/03/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo