2012-11-08 97 views
0

我想創建一個對象來存儲我將在我的web應用程序中使用的變量。屬性對象和此

我無法使用thisuriGetToken訪問clientIdclientSecret

另外我可以使用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()); 

    }); 
+0

可能重複[?如何返回Ajax響應文本(http://stackoverflow.com/questions/1225667/how-to-return-ajax -response-text) – Quentin

+0

對不起,但是你的鏈接和我的問題沒有關係,我在一個屬性中遇到了這個問題 – GibboK

+0

我剛剛注意到,雖然問題確實回答了你遇到的問題,但你還沒有遇到過這個問題。 – Quentin

回答

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) 
    } 
+0

所以我可以修復我的腳本? – GibboK

+0

我對我的答案做了一個新的修復。請參閱代碼。 – AlexStack

+0

感謝您的上次修改,請問您爲什麼要在URL中轉義角色?謝謝 – GibboK

1

這是一個常見的JavaScript的問題,因爲this關鍵字不會表現得像如Java或C++其他OOP語言。

的問題是:

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/

編輯:

爲對方的回答表明,你可能希望將它們嵌入到URL之前,您clientSecret和編碼的clientId。如果是這樣的話,你可以使用此代碼:

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); 
+1

「無論如何,如果你改變你的代碼就可以工作......」 - 不,不應該。它會給出'Uncaught TypeError:無法讀取未定義的屬性'clientId',因爲對象文字在創建之前未被分配到'mApiSettings'。 – Quentin

+1

感謝您提及錯誤。我將它固定在新代碼中。 – AlexStack

+0

感謝Alex的編輯和你的解釋 – GibboK