web-dev-qa-db-fra.com

Passer l'argument à l'obturateur d'objet JavaScript

var URIController = {
    get href() {
        return url.location.href;
    }
}

J'ai au-dessus de la structure d'objet. Mais la propriété URIController.href Dépend d'un autre objet, url.

Si le url est défini globalement, URIController.href Fonctionne. Mais je veux passer url objet à href getter manuellement.

var URIController = {
    get href(url) {
        return url.location.href;
    }
}

Changement du getter pour accepter le paramètre url mais

URIController.href(url)

renvoie une erreur car href n'est pas une fonction.

Est-il possible de passer des arguments à getter en javascript?

18
John Bernard

Dans votre exemple, vous n'appelez pas le getter, mais plutôt une fonction sur l'objet appelé href, qui n'existe pas. Mais la propriété href existe.

Les accesseurs ne nécessitent pas d'invocation explicite avec des parenthèses et ne peuvent donc pas accepter d'arguments. Leur invocation est implicite via la syntaxe standard d'accès aux propriétés, par ex. URIController.href.

De documentation getter sur MDN :

La syntaxe get lie une propriété d'objet à une fonction ...

  • Il doit avoir exactement zéro paramètres

______

Si vous devez accepter des arguments, utilisez plutôt une fonction:

var URIController = {
    href: function (url) {
        return url.location.href;
    }
}

Ou en utilisant la syntaxe abrégée de la fonction objet ES6:

const URIController = {
    href (url) {
        return url.location.href;
    }
}
13
sdgluck

Non, vous ne pouvez pas passer d'argument à un "getter", utilisez plutôt un "setter".

6
rudi Ladeon

Selon le spec

La propriété PropertyAssignment: get PropertyName () {FunctionBody} est évaluée comme suit:

...

  1. Soit la fermeture le résultat de la création d'un nouvel objet Function comme spécifié en 13.2 avec une liste de paramètres vide et un corps spécifié par FunctionBody.

Vous ne pouvez donc pas spécifier une liste de paramètres, tenter de le faire vous donnera une erreur de syntaxe

var obj = {
    get href(param){}     
}

Si vous ne souhaitez pas configurer une fonction normale, vous pouvez faire quelques solutions de contournement comme définir une propriété sur l'instance/l'objet de classe que le getter lira ensuite. Ou vous pouvez utiliser une fermeture lors de la création de votre objet, puis votre getter pourrait y accéder depuis la portée extérieure.

En tant que propriété instance/objet

var obj = {
    url:null,
    get href(){
       return this.url ? this.url.location.href : "";
    }
}

obj.url = {location:{href:"http://stackoverflow.com"}};
console.log( obj.href );

Avec un boîtier

function URIController(url){
    //You could also use `Object.defineProperty` to 
    //create the getter on a existing object
    return {
       get href(){
          return url.location.href;
       }
    }
}
var obj = URIController({location:{href:"http://stackoverflow.com"}});
console.log( obj.href );
4
Patrick Evans