将参数传递给JavaScript对象的getter方法

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

我有上述对象结构。但是URIController.href属性依赖于另一个对象url

如果全局定义了urlURIController.href就会起作用。但是我想手动将url对象传递给href getter。

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

将getter更改为接受url参数,但是

URIController.href(url)

因为href不是函数,所以抛出错误。

在JavaScript中,是否可以向getter传递参数?


1
据我所知,在任何语言中都不可能将参数传递给getter,您只能使用“普通”函数或引入依赖项。 - Paul S.
@PaulS。嗯...至少有一种语言允许这样做... - jrh
3个回答

26
获取器不需要使用括号进行显式调用,因此不能接受参数。它们的调用是通过标准属性访问语法隐式进行的,例如 URIController.href

来自 MDN 上的获取器文档:

get 语法将一个对象属性绑定到一个函数...

  • 它必须没有任何参数

如果您需要接受参数,请改用函数:

______

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

或者使用 ES6 对象函数简写语法:

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

这实际上是一个库。我只是想如果我能稍微修改getter,就可以在不用在库中替换所有属性为函数调用的情况下帮助自己。但似乎这是不可能的。 - John Bernard
1
@JohnBernard 我知道你现在可能已经弄清楚了,但是对于其他人来说,需要注意的是:为了使“getter”在库中的每次使用都能接收到URL参数,您必须无论如何修改getter的每个用法。 - Jemar Jones

8
根据该规范,对于 PropertyAssignment: get PropertyName() {FunctionBody} 的产生式进行如下评估:

...

2. 通过使用空参数列表按照13.2中的规定创建一个新函数对象,并且将其主体指定为 FunctionBody,从而得到闭包。

因此,您不能指定参数列表,否则将导致语法错误。

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

如果您不想设置一个正常的函数,那么您可以采用一些解决方案,例如在类实例/对象上设置一个属性,然后getter会读取它。或者您可以在创建对象时使用闭包,然后您的getter可以从外部范围访问它。
作为示例/对象属性:

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


7
不,你不能向“getter”传递参数,而应该使用“setter”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接