将参数传递给 JavaScript 对象 Getter

Passing Argument to JavaScript Object 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;
    }
}

更改了 getter 以接受 url 参数但是

URIController.href(url)

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

是否可以在 javascript 中将参数传递给 getter?

在您的示例中,您没有调用 getter,而是调用对象 href 上的一个函数,该函数不存在。但是 属性 href 确实存在。

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

来自getter documentation on MDN

The get syntax binds an object property to a function...

  • It must have exactly zero parameters

______

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

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

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

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

不,您不能将参数传递给“getter”,而是使用“setter”。

根据 spec

The production PropertyAssignment : get PropertyName ( ) { FunctionBody } is evaluated as follows:

...

  1. Let closure be the result of creating a new Function object as specified in 13.2 with an empty parameter list and body specified by FunctionBody.

因此您不能指定参数列表,尝试这样做会导致语法错误

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

如果你不想设置一个正常的功能,你可以做一些解决方法,比如在 class instance/object 上设置一个 属性,然后 getter读。或者您可以在创建对象时使用闭包,然后您的 getter 可以从外部范围访问它。

作为 instance/object 属性

var obj = {
    url:null,
    get href(){
       return this.url ? this.url.location.href : "";
    }
}

obj.url = {location:{href:"http://whosebug.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://whosebug.com"}});
console.log( obj.href );