分享

联合数组以及Prototype的风险

 WindySky 2009-07-03

联合数组以及Prototype的风险

    联合数组以及Prototype的风险

 

    Associative Arrays and the Risks of Prototype

 

    JavaScript的对象都可以作为联合数组(associative arrays,也称为哈希、哈希结构或者哈希表)。这就意味着你可以使用点符号来访问一个对象属性:

 

    someObject.objProperty

 

     你还可以使用数组符号访问一个属性,给出属性名称作为索引:

     someObject["objProperty"]

 

     在键值对之间进行映射是联合数组固有的特征。由于JavaScript对象可以作为联合数组,所以你也可以使用JavaScript的for...in语句来迭代对象的属性:

 

     for (props in obj) {...}

 

     你还可以利用任何JavaScript对象,来建立一个新的联合数组,包括Array、RegExp、Object、String等。如下代码就使用了Array对象,这也是非常恰当的用法:

 

     var newArray = new Array();

     newArray['1'] = 'one';

     newArray['3'] = 'three';

    

     它看上去非常简单,但是,这在那些使用JavaScript的人,尤其是使用Prototype的人之间会引发一些非常激烈的争论。

 

     有些人会说,在JavaScript中没有联合数组,这种功能只不过是添加运行期属性的一种方式罢了。但是,暂且不说语义如何,这种功能和联合数组是相匹配的(数组元素是由键或者名称,而不是由数字来指定的),因此,从各个方面来说,它都是联合数组。

 

     还有些人说,在JavaScript中使用联合数组是错误的,或者是有害的。他们解释说:使用Array对象建立一个联合数组,违反了自然规律——通常给你提供有关数组信息的方法就不再工作了,例如:长度,并且我们应该仅仅将Array对象,用于传统的数字数组来支持可预料的行为。

 

     对于Prototype来说,这是一个相当尖锐的问题,因为它通过prototype属性扩展了基本的Array对象。如果你从Array对象建立一个联合数组,而Prototype这样的库会扩展联合数组本身,那么当你使用for...in来查询它时,你可能会得到不可预料的结果,而且很有可能会导致应用程序中断。

 

     为了取代使用Array作为联合数组这种方式,一些Ajax专家建议使用Object。在Prototype 1.4版本中也使用了prototype属性,扩展了JavaScript中基本的Object,但Stephenson又把它从1.5版本中剔除了。因此它仍旧扩展了String、Array以及其他对象,如果使用联合数组功能来访问应用程序中的对象属性,你就应该清楚这些内容。

 

     警告:你也需要非常清楚prototype的扩展能力,如果你正在使用多个库,它们各自都有可能在原始的JavaScript对象上建立自己的扩展。这些库之间的冲突可能会导致一些很难调试而且又不可思议的问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多