对象的属性和这个

时间:2012-11-08 13:36:41

标签: javascript

我想创建一个对象来存储我将在我的网络应用中使用的变量。

我无法使用clientIdclientSecret访问uriGetTokenthis

此外,我可以使用mApiGetToken中的token中的功能。

你能告诉我我做错了什么以及如何解决它?

   $(document).ready(function () {

        // General Settings
        var mApiSettings = {
            clientId: 'aaa',
            clientSecret: 'bbb',
            token: mApiGetToken(),
            uriGetToken: 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + this.clientId + '&client_secret=' + this.clientSecret
        }

        console.log(mApiSettings.uriGetToken);
        // Get Autheticated, it requires getting a Token from HollyByte
        function mApiGetToken() {

            $.getJSON(mApiSettings.uriGetToken, processData);
            function processData(data) {
                mApiSettings.token = data.access_token;
            }
            //return token;
        }

        // For Testing
        console.log(mApiGetToken());

    });

2 个答案:

答案 0 :(得分:2)

在调用该函数时,函数确定this的值

您使用this的对象字面值与this的值之间没有任何关联。

也无法在创建它的对象文字语句中间访问对象的属性。

您需要使用变量。

虽然您的示例中没有任何特殊字符,但您应该养成将所有数据转换为URI的习惯。

    var clientId, clientSecret, mApiSettings;
    clientId = 'aaa';
    clientSecret = 'bbb';
    mApiSettings = {
        clientId: clientId,
        clientSecret: clientSecret,
        token: mApiGetToken(),
        uriGetToken: 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + encodeURIComponent(clientId) + '&client_secret=' + encodeURIComponent(clientSecret)
    }

答案 1 :(得分:1)

这是一个常见的Javascript问题,因为this关键字的行为与其他OOP语言(如Java或C ++)不同。

问题是:

var o = {
    a : 2,
    b : this.a *2
}
console.log( b ); //prints NaN because the value for this.a is undefined at the time b is being initialized

因为在对象文字初始化中无法访问this。解决方法是使用对象的名称而不是this

var o = {
    a : 2,
    b : o.a *2
}
console.log( b ); //prints 4

或者您可以一次定义一个对象:

var o = {
    a : 2
}
o.b = o.a *2;
console.log( b ); //prints 4

无论如何,如果您将mApiSettings更改为:

,您的代码应该有效
var mApiSettings = {
            clientId: 'aaa',
            clientSecret: 'bbb',
            token: mApiGetToken()
}

mApiSettings.uriGetToken = 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + mApiSettings.clientId + '&client_secret=' + mApiSettings.clientSecret;

您可以在此处详细了解Javascript this关键字:http://unschooled.org/2012/03/understanding-javascript-this/

编辑:

另一个答案表明,您可能希望在将clientSecret和clientId嵌入到URL之前对其进行编码。如果是这种情况,您可以使用以下代码:

var mApiSettings = {
            clientId: 'aaa',
            clientSecret: 'bbb',
            token: mApiGetToken()
}

mApiSettings.uriGetToken = 'https://ccc/oauth/token?grant_type=client_credentials&client_id=' + encodeURIComponent( mApiSettings.clientId ) + '&client_secret=' + encodeURIComponent( mApiSettings.clientSecret );