首页 > 解决方案 > 如何在所需模块中访问“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如果

[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

那么不仅所有对 API.js 的引用this.endpointthis.globalQueries正常工作,API.js 中的任何其他元素this也将正常工作,并确保在每个函数的调用时检索值,以便它是最新的有任何变化。

我不知道如何完成这项工作,所以任何帮助将不胜感激。

标签: javascriptnode.jsthis

解决方案


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

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)
    ...
  }
}

推荐阅读