将参数传递给JavaScript Object Getter

时间:2016-05-21 17:40:17

标签: 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;
    }
}

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

URIController.href(url)

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

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

3 个答案:

答案 0 :(得分:9)

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

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

来自getter documentation on MDN

  

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

     
      
  • 必须具有完全零参数
  •   

______

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

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

或使用ES6对象功能的简写语法:

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

根据spec

  

生产PropertyAssignment:get PropertyName(){FunctionBody}的评估如下:

     

...

     
      
  1. 让闭包成为创建一个新的Function对象的结果   13.2中指定的空参数列表和指定的正文   函数体。
  2.   

因此您无法指定参数列表,尝试这样做会给您一个语法错误

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

相关问题