Передача аргумента в объект JavaScript Getter

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

У меня выше структуры объекта. Но свойство URIController.href зависит от другого объекта, url.

Если url определяется глобально, работает URIController.href. Но я хочу передать объект url в href getter вручную.

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

Изменен приемник, чтобы принять параметр url, но

URIController.href(url)

выдает ошибку, потому что href не является функцией.

Можно ли передавать аргументы в getter в javascript?

Ответ 1

В вашем примере вы вызываете не геттер, а функцию объекта href, которого не существует. Но свойство href существует.

Получатели не требуют явного вызова с круглыми скобками и поэтому не могут принимать аргументы. Их вызов неявный через стандартный синтаксис доступа к свойству, например, URIController.href.

Из геттерной документации по MDN:

Синтаксис get связывает свойство объекта с функцией...

  • Должно иметь ровно ноль параметров

______

Если вам нужно принять аргументы, используйте вместо этого функцию:

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

Или используя сокращенный синтаксис функции объекта ES6:

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

Ответ 2

Нет, вы не можете передать аргумент "getter" вместо "setter".

Ответ 3

В соответствии с spec

Производственный PropertyAssignment: get PropertyName() {FunctionBody} оценивается следующим образом:

...

  1. Пусть замыкание является результатом создания нового объекта Function как указанный в 13.2 с пустым списком параметров и телом, указанным в FunctionBody.

Таким образом, вы не можете указать список параметров, пытаясь сделать это, вы получите синтаксическую ошибку

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

Ответ 4

Это зависит от того, чего вы хотите достичь, но решение может состоять в том, чтобы вернуть функцию в геттер. В некоторых случаях может быть полезно сделать:

const myObj = {
  foo: 'bar',
  get MyProperty {
    return suffix => '${this.foo}${suffix}'
  }
}