我正在尝试制作一个模块,用作某个站点的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.endpoint
和this.globalQueries
的引用都可以正常工作,而且API.js this
中的任何其他元素也将正常工作,并确保这些值是在调用时针对每个函数进行检索,因此它具有最新的更改。
我对如何使这项工作不知所措,因此将不胜感激。
答案 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
})
}
}
因此上下文对象将在父母及其子女之间共享