JavaScript对象调用不起作用

时间:2012-01-16 11:24:40

标签: javascript object

我有一个像这样创建的对象:

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];

我可以让它像那样工作吗?因为我在某个地方看过这个方法,但我不知道它是否与我的相同。

5 个答案:

答案 0 :(得分:3)

使用此:

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

您尝试调用的代码无效:

classes[login.form.wrapper];

您指的是未定义的login变量。

答案 1 :(得分: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的等价物。

答案 2 :(得分:1)

答案与您的描述非常吻合。

您基本上想要的是在您的案例中访问特定属性,嵌套属性。

classes.login.form.wrapper;

这非常直观地认识到,登录是在类内部,在窗体内部形成,包装内部形式。

JavaScript还允许您将属性名称用作索引,如:

classes['login'];

然而,

classes[login.form.wrapper];

实际上这意味着要查找名称存储在

中的classes属性
login.form.wrapper

显然,login.form.wrapper并不存在。

答案 3 :(得分:0)

当你写

classes[login.form.wrapper];

预期对象登录。 由于login是类的一部分,您必须指定类的整个“路径”。

答案 4 :(得分:0)

你不能像这样调用对象

类[login.form.wrapper];

因为登录是对象类的关键,它将像这样工作

classes ['login'] OR classes.login

你的密钥不应该是这样的:classes [login.form.wrapper];