2013-05-30 59 views
2

我有以下的Javascript对象定义:不能填充JavaScript对象属性值与使用功能

var APIUserItem = function() { 
var 
    id = '', 
    account_id = '', 
    client_id = '', 
    user_name = '', 
    salutation = '', 
    first_name = '', 
    middle_name = '', 
    last_name = '', 
    organization_name = '', 
    alternate_email = '', 
    time_zone_id = '', 
    utcoffset = '', 
    date_created = new Date(), 
    last_updated_date = new Date(), 
    is_active = null, 
    is_approved = null, 
    classes = [], 
    groups = [], 
    permissions = [], 
    properties = {}, 
    version_stamp_hash_string = '', 

    getFromData = function (data) { 
     id = data.ID; 
     account_id = data.AccountID; 
     client_id = data.ClientID; 
     user_name = data.UserName; 
     salutation = data.Salutation; 
     first_name = data.FirstName; 
     middle_name = data.MiddleName; 
     last_name = data.LastName; 
     organization_name = data.OrganizationName; 
     alternate_email = data.AlternateEmail; 
     time_zone_id = data.TimeZoneID; 
     utcoffset = data.UTCOffset; 
     date_created = data.DateCreated; 
     last_updated_date = data.LastUpdatedDate; 
     is_active = data.IsActive; 
     is_approved = data.IsApproved; 
     properties = data.Properties; 
     version_stamp_hash_string = data.VersionStampHashString; 

     // list of pointers to classes 
     $.each(data.Classes, function (index, value) { 
      class_pointer = new APIPointerItem(); 
      class_pointer.ID = value.ID; 
      class_pointer.PublicID = value.PublicID; 
      class_pointer.Name = value.Name; 
      class_pointer.RelativeURI = value.RelativeURI; 

      classes.push(class_pointer); 
     }); 

     // list of pointers to Groups 
     $.each(data.Groups, function (index, value) { 
      group_pointer = new APIPointerItem(); 
      group_pointer.ID = value.ID; 
      group_pointer.PublicID = value.PublicID; 
      group_pointer.Name = value.Name; 
      group_pointer.RelativeURI = value.RelativeURI; 

      groups.push(group_pointer); 
     }); 

     // list of permissions 
     $.each(data.Permissions, function (index, value) { 
      permission_pointer = new APIPermissionList(); 
      permission_pointer.ID = value.ID; 
      permission_pointer.Description = value.Description; 
      permission_pointer.Category = value.Category; 
      permission_pointer.Level = value.Level; 
      permission_pointer.ResourceType = value.ResourceType, 
         permission_pointer.Action = value.Action; 

      permissions.push(permission_pointer); 
    }); 

}; 

return { 
    ID: id, 
    AccountID: account_id, 
    ClientID: client_id, 
    UserName: user_name, 
    Salutation: salutation, 
    FirstName: first_name, 
    MiddleName: middle_name, 
    LastName: last_name, 
    OrganizationName: organization_name, 
    AlternateEmail: alternate_email, 
    TimeZoneID: time_zone_id, 
    UTCOffset: utcoffset, 
    DateCreated: date_created, 
    LastUpdatedDate: last_updated_date, 
    IsActive: is_active, 
    IsApproved: is_approved, 
    Classes: classes, 
    Groups: groups, 
    Permissions: permissions, 
    Properties: properties, 
    VersionStampHashString: version_stamp_hash_string, 
    GetFromData: getFromData 
}; 

};

var user = new APIUserItem(); 
user.GetFromData(data); 

然后尝试访问在新项目中的值,像这样:

document.write(user.ID); 

所有属性值的回来空的,除了

当我通过调用new了一个APIUserItem对于包含预期数据的集合。例如,我可以从对象外部遍历Groups数组,并访问每个组的属性以显示值。

我传递给GetFromData函数调用的数据对象包含所有数据 - 它似乎只是局部变量的赋值不起作用?我知道我一定在代码中犯了一些明显的错误。任何人都可以帮我找到我的问题吗?

+1

啊,我的眼睛为什么要宣布你的变数? – Ryan

+0

@ryan对不起,如果我打破你的眼睛: - )...请参阅“揭示模块模式”:http://blog.pluralsight.com/2012/10/02/revealing-module-pattern-structuring-javascript-代码部分iii/ –

+0

嗯,感谢您的链接,我以前没有见过。我认为我的本能反应不是这样的,因为JavaScript中的变量可以不使用'var'来声明,但当然它最终会在全局范围内展开,并且一看就是它正在发生的事情。 – Ryan

回答

3

您对本地变量的分配可能正在工作,但它们只是:分配给本地变量。您的代码不会更新对象的属性。事实上,通过return声明来创建对象,该声明从局部变量初始化属性并不会创建局部变量和属性之间的魔术链接。

你“getFromData”功能应该是这个样子:

function getFromData(data) { 
    this.ID = data.ID; 
    this.AccountID = data.AccountID; 
    // and so on 
} 

集合属性(“类”,“组”,“权限”)的工作,因为他们的对象,并更新其内容。那部分没关系。真的,你根本不需要这些局部变量;你可以直接初始化对象属性。

+0

谢谢。所以过去常常看到我的大脑正在努力的其他语言重新回到了Javascript框架中。 –