web-dev-qa-db-ja.com

JavaScriptオブジェクトゲッターに引数を渡す

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でゲッターに引数を渡すことは可能ですか?

18
John Bernard

あなたの例では、ゲッターを呼び出すのではなく、存在しないhrefというオブジェクトの関数を呼び出しています。しかし、propertyhrefは存在します。

ゲッターは括弧による明示的な呼び出しを必要としないため、引数を受け入れることができません。それらの呼び出しは、標準のプロパティアクセス構文を介して暗黙的に行われます。 URIController.href

MDNに関するより良いドキュメント から:

Get構文は、オブジェクトプロパティを関数にバインドします...

  • 正確にゼロのパラメータが必要です

______

引数を受け入れる必要がある場合は、代わりに関数を使用します。

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

または、ES6オブジェクト関数の省略構文を使用します。

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

いいえ、「getter」に引数を渡すことはできません。「setter」を使用してください。

6
rudi Ladeon

spec のとおり

プロダクションPropertyAssignment:get PropertyName(){FunctionBody}は次のように評価されます。

...

  1. 空のパラメーターリストおよび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 );
4
Patrick Evans