如何从方法 JS 访问类变量

Posted

技术标签:

【中文标题】如何从方法 JS 访问类变量【英文标题】:How can I access class variable from method JS 【发布时间】:2019-08-05 01:54:30 【问题描述】:

我是 javascript 的新手,我正在尝试使用某种方法创建一个简单的类,但我遇到了一个问题,我不知道我做错了什么。

var SpotifyWebApi = require('spotify-web-api-node');

const my_client_id = "xxx";
const my_secret = "xxx";

class Spotify 
    constructor() 
         this.spotifyApi = new SpotifyWebApi(
            redirectUri: 'http://localhost:8081/spotifyCallback',
            clientId: my_client_id,
            clientSecret: my_secret
        ); 
    

    connect() 
        console.log(this.spotifyApi.redirectUri);
        return spotifyApi.createAuthorizeURL('teststate', ['user-read-private', 'user-read-email']);
    ;

在这里,当我尝试登录控制台 spotifyApi.redirectUri 时,我得到未定义(尝试使用和不使用 this 关键字)。

【问题讨论】:

你能说明你是怎么打电话给connect的吗? @CertainPerformance var Spotify = require("./services/spotify.js").Spotify var spotify = new Spotify(); [...] app.get('/spotify', function (req, res) res.redirect(spotify.connect()); ); 【参考方案1】:

这是因为您的 lib (https://github.com/thelinmichael/spotify-web-api-node) 在实例化它时使用 redirectUri 作为选项,但没有将其作为属性公开。

如果您仍然需要它,请将 redirectUri 放入类属性中,如下所示:

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

class Spotify 
    constructor(my_client_id, my_secret) 
         this.redirectUri = 'http://localhost:8081/spotifyCallback';
         this.spotifyApi = new SpotifyWebApi(
            redirectUri: this.redirectUri,
            clientId: my_client_id,
            clientSecret: my_secret
        ); 
    

    connect() 
        console.log(this.redirectUri);
        return this.spotifyApi.createAuthorizeURL('teststate', ['user-read-private', 'user-read-email']);
    ;


const my_client_id = "xxx";
const my_secret = "xxx";

// Now you can instantiate your class with this :
const spotify = new Spotify(my_client_id, my_secret);
const yourToken = spotify.connect();

我用一些好的做法编辑了我的答案(添加构造函数参数,使用this,...)

【讨论】:

好的,谢谢!如果我不想在 connect 方法中使用对象 spotifyApi,我应该使用 this.spotifyApi ? 您实际上需要使用this.spotifyApi。我编辑了我的答案。此外,最好将my_client_idmy_secret 作为构造函数中的参数传递。 @Seblor,你的意思是 spotify 有这种方式来实例化和设置选项吗?如果我在构造函数中传递简单对象并尝试访问我能够读取的属性。 您使用的 API 有一个类(您命名为“SpotifyWebApi”),在构造它时需要一个对象作为参数。该对象包含它需要的所有选项:“redirectUri”、“clientId”和“clientSecret”。但是,您可能无法从结果对象中访问它们,这取决于 APi 在构造函数中的作用。如果您想拥有可以在整个类实例中访问的变量,则需要将它们放在具有 this.yourProperty = "yourValue" 之类的属性中。 好的,只是想知道这对 clientId 和其他参数是如何工作的。查看 spotify-web-api.js 的来源,我无法设置它尝试访问和使用这些选项的方式有任何区别github.com/thelinmichael/spotify-web-api-node/blob/master/src/…【参考方案2】:

您访问对象的方式不正确。看看下面的代码和输出。

const SpotifyWebApi = require('spotify-web-api-node');
const my_client_id = "xxx";
const my_secret = 'xxx';
const redirectUri='http://localhost:8081/spotifyCallback';

    class Spotify        
        constructor(my_client_id, my_secret, redirectUri) 
            this.spotifyApi = new SpotifyWebApi(
                clientId: my_client_id,
                clientSecret: my_secret,
                redirectUri: redirectUri
            );
                
        connect() 
            console.log(JSON.stringify(spotify.spotifyApi._credentials,null,4));
            console.log(this.spotifyApi._credentials.redirectUri);       
            return this.spotifyApi.createAuthorizeURL(['user-read-private', 'user-read-email'],'teststate');
        ;
    

    //Instantiate
    const spotify = new Spotify(my_client_id, my_secret ,redirectUri);
    const connectObject = spotify.connect();

输出:

    
    "clientId": "xxx",
    "clientSecret": "xxx",
    "redirectUri": "http://localhost:8081/spotifyCallback"
    
    http://localhost:8081/spotifyCallback

您还没有为 createAuthorizeURL 传递正确的参数。看看上面的signautre和spotify-web-api-node

【讨论】:

感谢您抽出宝贵时间跟进 OP 的问题。我承认我没有多少时间。我读了一下源代码,我想知道你是否可以用this.spotifyApi.getRedirectURI() 替换this.spotifyApi._credentials.redirectUri(那里定义了getter:github.com/thelinmichael/spotify-web-api-node/blob/master/src/…)

以上是关于如何从方法 JS 访问类变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类(java)访问主类的变量?

如何从另一个类访问mysql数据库中的变量?

如何从 kotlin 中的内部对象类访问类级别变量

从不同的类调用主变量

子类如何访问父类

如何从泛型类访问静态变量?