如何在所需模块中访问“ this”?

时间:2019-01-05 22:39:38

标签: javascript node.js this

我正在尝试制作一个模块,用作某个站点的API包装器。出于组织目的,有一个API类的中央文件,该文件在构造函数中运行某些逻辑,并要求这些文件包含用于与API进行交互的功能,这些文件根据lib目录中的类别分为不同的文件。

[API.js]

const Search = require('./lib/search'),
    Character = require('./lib/character')
    ...

class API {
    constructor(apikey, options = {}) {
        /* some logic... */

        this.endpoint = 'https://some.site/'
        this.globalQueries = {
            key: apikey,
            language: options.lang || 'en',
            ...
        }

        this.search = new Search()
        this.character = new Character()
        ...
    }
}

module.exports = API

我想做的是在所有必需的文件中(可能不是正确的措词)从该范围访问this,例如,如果./lib/character的内容是< / p>

[lib/character.js]

const request = require('request-promise-native')

class Character {
    constructor() {}

    look(name, params = {}) {
        request({
            uri: this.endpoint + 'character/look',
            qs: Object.assign(this.globalQueries, params),
            json: true
        }).then((res) => {
            ...
    }
}

module.exports = Character

然后,不仅所有对this.endpointthis.globalQueries的引用都可以正常工作,而且API.js this中的任何其他元素也将正常工作,并确保这些值是在调用时针对每个函数进行检索,因此它具有最新的更改。

我对如何使这项工作不知所措,因此将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以将父实例作为参数传递给每个构造函数,如下所示:

class Character {
  constructor (parent) {
    this.parent = parent
  }

  look (name, params = {}) {
    request({
      uri: this.parent.endpoint,
      qs: Object.assign(this.parent.globalQueries, params),
      json: true
    })
  }
}

然后,在API类定义中:

class API {
  constructor(apikey, options = {}) {
    /* some logic... */

    this.endpoint = 'https://some.site/'
    this.globalQueries = {
      key: apikey,
      language: options.lang || 'en',
      ...
    }

    this.search = new Search(this)
    this.character = new Character(this)
    ...
  }
}

答案 1 :(得分:0)

我个人认为最好在构造函数中指定对Character和Search的需求,这样更清晰易懂。这样看起来就可以了

class API {
    constructor(apikey, options = {}) {
        /* some logic... */
        const context = {
            endpoint: 'https://some.site/',
            globalQueries: {
                key: apikey,
                language: options.lang || 'en',
            },
        }
        this.context = context;

        this.search = new Search(context)
        this.character = new Character(context)
    }
}

class Character {
    constructor (context) {
      this.context = context
    }

    look (name, params = {}) {
      request({
        uri: this.context.endpoint,
        qs: Object.assign(this.context.globalQueries, params),
        json: true
      })
    }
  }

因此上下文对象将在父母及其子女之间共享