javascript - 如何在所需模块中访问“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.endpoint
和this.globalQueries
正常工作,API.js 中的任何其他元素this
也将正常工作,并确保在每个函数的调用时检索值,以便它是最新的有任何变化。
我不知道如何完成这项工作,所以任何帮助将不胜感激。
解决方案
您可以将父实例作为参数传递给每个构造函数,如下所示:
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)
...
}
}
推荐阅读
- swiftui - 推迟 init() AVPlayer SwitUI
- wix3 - 始终在 WiX 中安装和跳过 MaintenanceTypeDlg 对话框
- javascript - 如何通过 JavaScript 正确使用批量删除 VSCode
- angular - 组件级别的 Angular 模拟服务
- python-3.x - python re sub 替换值
- r - 如果我只有边缘名称,如何创建网络?
- javascript - 如何编写 JS 函数来更改具有特定类的所有元素的文本?
- html - 如何在另一个元素上使用用户代理默认样式表?
- javascript - 使用 webspace 目录创建图像标记
- vue.js - 从 vue3 中的 v-on 事件处理程序访问元素