一种声明JavaScript Options-Object的正确方法?

时间:2013-12-11 11:30:42

标签: javascript node.js object

我想访问一个用一些JSON响应的API。因此,我想配置一个'options'对象,它存储访问api所需的所有数据(url,tokens,id等)。

以下版本有效

var Options = function (token, id) {
  this.token = token;
  this.id = id;
  this.host = 'http://super-cool-api.com/';
  this.path = 'api/fetch/id/';
  this.url = '' + this.host + this.path + this.id + '?token=' + this.token
};
var options = new Options('abc', 3);

// options.url = "http://super-cool-api.com/api/fetch/id/3?token=abc"

基本上'options.url'就是我想要的。但是我试图为'options'对象声明一个更全面的表单,如:

var options = {
  token : 'abc',
  id : 3,
  host : 'http://super-cool-api.com/',
  path : 'api/fetch/id/',
  url : '' + this.host + this.path + this.id + '?token=' + this.token
};

// options.url = "undefinedundefinedundefined?token=undefined"

好的,我明白我必须以其他方式访问options.url中的值。但是怎么样?这甚至是常见做法吗?

我的第一个解决方案呢?建议这样做吗?

此致 克里斯托弗

2 个答案:

答案 0 :(得分:2)

不幸的是,您的第二个示例中的this指向包含代码的对象,即 NOT options,这就是变量未定义的原因。第一个解决方案很好,就像:

function makeOptions(token, id) {
    var host = 'http://super-cool-api.com/',
        path : 'api/fetch/id/';
    return {
        token: token,
        id: id,
        host: host,
        path: path,
        url: '' + host + path + id + '?token=' + token
    };
}

选择最适合你的方式。

答案 1 :(得分:1)

你展示的两种方式都可以做到这一点,就像最常见/标准的做法一样,我真的不知道。

以下是如何使您展示的第二个选项正常工作的示例:

将选项的url设置为构建URL并将其返回的函数。

var options = {
    token : 'abc',
    id : 3,
    host : 'http://super-cool-api.com/',
    path : 'api/fetch/id/',
    url : function() {
        return '' + this.host + this.path + this.id + '?token=' + this.token;
    }
};

然后您可以使用以下代码检索值:var testUrl = options.url();

以下是两个示例的示例JSFiddle以及我的示例(选项3)