在另一个内部调用原型方法会导致“不是函数”

时间:2018-08-13 07:15:51

标签: javascript node.js prototype

不知道我在这里做错了什么,因为我以前有做过这种模式。

尝试运行以下代码时出现此错误:

this.getSpotifyApi is not a function

不确定为什么失去了this范围。这是对象定义的开始:

const logger = require('logger');
const SpotifyApiNode = require('spotify-web-api-node');

module.exports = SpotifyApi;

function SpotifyApi(userRefreshToken) {
    this.refreshToken = userRefreshToken;
    this.initializeApi()
        .then(() => logger.debug('api object initialized'));
};

/**
 * initialize api object
 */
SpotifyApi.prototype.initializeApi = () => {
    let self = this;
    logger.info(this.refreshToken);
    this.getSpotifyApi(this.refreshToken)
        .then((api) => {
            self.api = api;
        });
};

/**
 * get a spotify api wrapper object 
 */
SpotifyApi.prototype.getSpotifyApi = (userToken) => {
    if (userToken)
        return this.getUserTokenApi(userToken);

    return this.getServerTokenApi();
};

根据我的测试,当this.function调用是对象实例化后第一个被调用,而第二个总是失败时,它似乎总是可以工作。不知道在这种情况下我正在做些什么导致此问题。

1 个答案:

答案 0 :(得分:1)

箭头函数将其定义的上下文的this绑定到该函数。因此,如果您从SpotifyApi创建一个实例并对其调用initializeApi,则this中的initializeApi不是该对象的实例,而是其他某个对象。< / p>

将箭头功能更改为常规功能,它将起作用:

SpotifyApi.prototype.initializeApi = function() {
    let self = this;
    logger.info(this.refreshToken);
    this.getSpotifyApi(this.refreshToken)
        .then((api) => {
            self.api = api;
        });
};

对您分配给SpotifyApi.prototype的所有其他功能执行相同操作