2012-01-16 48 views
1

我有這樣造成了一定的對象:JavaScript對象調用不工作

var classes = { 

     login: { 
      form: { 
       wrapper:  'content-login', 
       cls:   'login-form', 
       fields:   'login-fields' 
      }, 
      username: { 
       wrapper:  'username-wrapper', 
       label:   'user-img', 
       input:   'username' 
      }, 
      password: { 
       wrapper:  'password-wrapper', 
       label:   'pass-img', 
       input:   'password' 
      }, 
      button: { 
       wrapper:  'login-wrapper', 
       proceed:  'login' 
      }, 
      toogle: { 
       trigger: { 
        wrapper: 'toogle-button', 
        button:  'toogle' 
       }, 
       buttons: { 
        wrapper: 'toogle-buttons', 
        twitter: 'twitter-login', 
        register: 'register', 
        recover: 'recover-password' 
       } 
      } 
     }, 

     register: { 
      form: { 
       wrapper:  'content-register', 
       cls:   'register-form', 
       fields:   'register-fields' 
      }, 
      username: { 
       wrapper:  'username-wrapper', 
       label:   'username-label', 
       input:   'username' 
      }, 
      email: { 
       wrapper:  'email-wrapper', 
       label:   'email-label', 
       input:   'email' 
      }, 
      password: { 
       wrapper:  'password-wrapper', 
       label:   'password-label', 
       input:   'password' 
      }, 
      confirm: { 
       wrapper:  'confirm-wrapper', 
       label:   'confirm-label', 
       input:   'confirm' 
      }, 
      captcha: { 
       wrapper:  'captcha-wrapper', 
       label:   'captcha-label', 
       input:   'captcha' 
      }, 
      button: { 
       wrapper:  'register-wrapper', 
       message:  'message-handling', 
       proceed:  'register' 
      }, 
      back: { 
       wrapper:  'back-button', 
       button:   'back' 
      } 
     }, 

     recover: { 
      form: { 
       wrapper:  'content-recover', 
       cls:   'recover-form', 
       fields:   'recover-fields' 
      }, 
      email: { 
       wrapper:  'email-wrapper', 
       label:   'email-label', 
       input:   'email' 
      }, 
      button: { 
       wrapper:  'recover-wrapper', 
       proceed:  'recover' 
      }, 
      back: { 
       wrapper:  'back-button', 
       button:   'back' 
      } 
     }, 

     reset: { 
      form: { 
       wrapper:  'content-reset', 
       cls:   'reset-form', 
       fields:   'reset-fields' 
      }, 
      email: { 
       wrapper:  'email-wrapper', 
       label:   'email-label', 
       input:   'email' 
      }, 
      authcode: { 
       wrapper:  'authcode-wrapper', 
       label:   'authcode-label', 
       input:   'authcode' 
      }, 
      password: { 
       wrapper:  'password-wrapper', 
       label:   'password-label', 
       input:   'password' 
      }, 
      confirm: { 
       wrapper:  'confirm-wrapper', 
       label:   'confirm-label', 
       input:   'confirm' 
      }, 
      button: { 
       wrapper:  'proceed-wrapper', 
       message:  'message-handling', 
       proceed:  'proceed' 
      }, 
      back: { 
       wrapper:  'back-button', 
       button:   'back' 
      } 
     }, 

     success: { 
      wrapper:   'after-login', 
      message:   'row-one', 
      buttons: { 
       wrapper:  'row-two', 
       cancel:   'cancel', 
       proceed:  'continue' 
      } 
     }, 

     lockdown: { 
      wrapper:   'system-lockdown', 
      message:   'row-one', 
      buttons: { 
       wrapper:  'row-two', 
       back:   'back' 
      } 
     } 

    } 

而且我試圖調用某些關鍵是這樣的:

classes[login.form.wrapper]; 

但它不工作這樣一來,只有這樣的:

classes.login.form.wrapper; 

或者這樣:

classes['login']; 

誰能告訴我,爲什麼它不喜歡這個工作:

classes[login.form.wrapper]; 

而且我可以把它這樣的工作嗎?因爲我在某處看過這種方法,但我不知道它是否與我的相同。

回答

1

classes[login.form.wrapper];正在尋找名爲任何範圍的代碼行中運行login的對象。這將不會被發現,因爲loginclasses屬性。這會因此引發ReferenceError,因爲login未定義。

如果login定義,並有一個屬性命名form這反過來有一個屬性命名wrapper,該屬性的值將用於:

var login = { 
     form: { 
      wrapper: 'login' 
     } 
    }; 
console.log(classes[login.form.wrapper]); //Now this would return classes.login 

classes.login.form.wrapper;作品,因爲classes是一個對象與屬性名稱爲login

classes['login'];相當於classes.login。您可以將classes['login']['form']['wrapper']等同於classes.login.form.wrapper

+0

是的,我發現我不能,因爲我嘗試用'try {...} catch {...}'調試,我看到它給了我一個ReferenceError,但是,沒有辦法讓那工作?因爲我有超過500行代碼需要修改才能正常工作? – Roland 2012-01-16 11:33:41

+0

@Roland - 查看我的編輯。你可以用適當的屬性創建一個'login'對象,但這非常混亂。我會建議重構你的代碼! – 2012-01-16 11:36:26

+0

你的意思是做'classes ['login'] ['form'] ['wrapper']'。那麼,如果是這樣的話,這意味着我將不得不經歷所有這些: – Roland 2012-01-16 11:37:35

0

當你寫

classes[login.form.wrapper]; 

對象登錄的預期。 因爲login是類的一部分,所以您必須指定類的整個「路徑」。

0

你不能這樣稱呼對象

classes [login.form.wrapper];

,因爲登錄是你的對象類的鍵,它會像這樣

類[「登錄」]或classes.login

你的關鍵不應該是這樣的:類[login.form。包裝];

3

使用此:

classes['login']['form']['wrapper'] 

代碼你試圖調用就是無效:

classes[login.form.wrapper]; 

你是指一個沒有被定義的變量login

1

答案與您的描述非常相似。

你基本上想要的是訪問特定屬性,嵌套屬性在你的情況。

classes.login.form.wrapper; 

這是非常直觀的認識到,登錄是在類內,登錄形式和內部形式包裝。

的JavaScript還允許您使用屬性名稱的指標,如:

classes['login']; 

然而,隨着

classes[login.form.wrapper]; 

它實際上意味着尋找的classes其名稱存儲在屬性

login.form.wrapper 

顯然,login.form.wrapper ,它本身並不存在。