Передача аргумента в объект 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} оценивается следующим образом:
...
- Пусть замыкание является результатом создания нового объекта Function как указанный в 13.2 с пустым списком параметров и телом, указанным в FunctionBody.
Таким образом, вы не можете указать список параметров, пытаясь сделать это, вы получите синтаксическую ошибку
var obj = {
get href(param){}
}
Ответ 4
Это зависит от того, чего вы хотите достичь, но решение может состоять в том, чтобы вернуть функцию в геттер. В некоторых случаях может быть полезно сделать:
const myObj = {
foo: 'bar',
get MyProperty {
return suffix => '${this.foo}${suffix}'
}
}