2016-05-21 21 views
3
var URIController = { 
    get href() { 
     return url.location.href; 
    } 
} 

Ich habe obige Objektstruktur. Aber URIController.href Eigenschaft hängt von einem anderen Objekt, url.Argument übergeben an JavaScript Objekt Getter

Wenn global definiert ist, funktioniert URIController.href. Aber ich möchte url Objekt zu href Getter manuell übergeben.

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

den Getter Changed URL-Parameter zu akzeptieren, aber

URIController.href(url) 

wirft Fehler, da href keine Funktion ist.

Ist es möglich, Argumente zu Getter in JavaScript übergeben?

+1

AFAIK ist es nicht möglich, args zu einem Getter in jedem passieren lan Man müsste entweder eine _ "normale" _ Funktion verwenden oder eine Abhängigkeit einführen. –

Antwort

5

In Ihrem Beispiel rufen Sie nicht den Getter auf, sondern eine Funktion für das Objekt href, das nicht existiert. Aber die Eigenschafthref existiert.

Getter erfordern keinen expliziten Aufruf mit Klammern und können daher keine Argumente akzeptieren. Ihr Aufruf ist implizit über die Standardeigenschaftszugriffssyntax, z.B. URIController.href.

Von getter documentation on MDN:

Die get-Syntax eine Objekt-Eigenschaft auf eine Funktion bindet ...

  • Es muss genau Null Parameter

______

Wenn Sie eine benötigen ccept Argumente verwenden, um eine Funktion statt:

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

Oder mit ES6 Objektfunktion Stenografie Syntax:

const URIController = { 
    href (url) { 
     return url.location.href; 
    } 
} 
+0

Das war eigentlich eine Bibliothek. Ich dachte nur, wenn ich Getter etwas ändern könnte, kann ich mir helfen, ohne alle Eigenschaften durch Funktionsaufrufe in der Bibliothek zu ersetzen. Aber es scheint, dass es nicht möglich ist. –

+0

@JohnBernard Ich weiß, dass du das wahrscheinlich schon herausgefunden hast, aber eine Anmerkung an andere: Damit der 'Getter' den URL-Parameter erhält, wenn er in der Bibliothek verwendet wird, müsstest du sowieso jede Verwendung des GETTER ändern. –

2

Nein, man kann kein Argument an einen "Getter" passiert einen "Setter" verwendet eher .

1

Gemäß der spec

Die Produktion PropertyAssignment: get Property() {} FunctionBody wird wie folgt bewertet:

...

  1. Lassen Sie schließen das Ergebnis von erstellen ein neues Function-Objekt als in 13.2 mit einer leeren Parameterliste und Körper durch FunctionBody angegebenen Körper.

So können Sie nicht eine Parameterliste angeben, so zu tun versuchen, wird Ihnen eine Syntaxfehler

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

Wenn Sie Sie eine normale Funktion einrichten möchten nicht könnte einige Workarounds wie eine Eigenschaft für die Klasseninstanz/Objekt, die der Getter dann lesen würde. Oder Sie könnten beim Erstellen Ihres Objekts eine Sperrung verwenden, damit Ihr Getter vom äußeren Bereich darauf zugreifen kann.

Als Beispiel/Objekteigenschaft

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

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

Mit einem Gehäuse

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);