var URIController = {
get href() {
return url.location.href;
}
}
上記のオブジェクト構造があります。だが URIController.href
プロパティは別のオブジェクトurl
に依存しています。
url
がグローバルに定義されている場合、URIController.href
機能します。しかし、url
オブジェクトをhref
ゲッターに手動で渡したいのですが。
var URIController = {
get href(url) {
return url.location.href;
}
}
Getterを変更してurlパラメータを受け入れるようにしましたが、
URIController.href(url)
hrefは関数ではないため、エラーをスローします。
JavaScriptでゲッターに引数を渡すことは可能ですか?
あなたの例では、ゲッターを呼び出すのではなく、存在しないhref
というオブジェクトの関数を呼び出しています。しかし、propertyhref
は存在します。
ゲッターは括弧による明示的な呼び出しを必要としないため、引数を受け入れることができません。それらの呼び出しは、標準のプロパティアクセス構文を介して暗黙的に行われます。 URIController.href
。
Get構文は、オブジェクトプロパティを関数にバインドします...
- 正確にゼロのパラメータが必要です
______
引数を受け入れる必要がある場合は、代わりに関数を使用します。
var URIController = {
href: function (url) {
return url.location.href;
}
}
または、ES6オブジェクト関数の省略構文を使用します。
const URIController = {
href (url) {
return url.location.href;
}
}
いいえ、「getter」に引数を渡すことはできません。「setter」を使用してください。
spec のとおり
プロダクションPropertyAssignment:get PropertyName(){FunctionBody}は次のように評価されます。
...
- 空のパラメーターリストおよびFunctionBodyで指定された本文を使用して、13.2で指定された新しい関数オブジェクトを[////]作成した結果をクロージャとします。
したがって、パラメータリストを指定することはできません。指定しようとすると、構文エラーが発生します。
var obj = {
get href(param){}
}
通常の関数を設定したくない場合は、ゲッターが読み取るクラスインスタンス/オブジェクトにプロパティを設定するなど、いくつかの回避策を実行できます。または、オブジェクトの作成時にクロージャーを使用して、ゲッターが外部スコープからアクセスできるようにすることもできます。
インスタンス/オブジェクトプロパティとして
var obj = {
url:null,
get href(){
return this.url ? this.url.location.href : "";
}
}
obj.url = {location:{href:"http://stackoverflow.com"}};
console.log( obj.href );
エンクロージャー付き
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 );