你的位置:首页 > 软件开发 > Java > [Effective JavaScript 笔记]第43条:使用Object的直接实例构造轻量级的字典

[Effective JavaScript 笔记]第43条:使用Object的直接实例构造轻量级的字典

发布时间:2016-06-23 10:00:07
js对象的核心是一个字符串属性名与属性值的映射表。使用对象实现字典易如反掌,字典是可变长的字符串与值的映射集合。for...injs提供了枚举一个对象属性名的利器--for...in循环。var dict={zhangsan:34,lisi:24,wangwu:62};var p ...

js对象的核心是一个字符串属性名与属性值的映射表。使用对象实现字典易如反掌,字典是可变长的字符串与值的映射集合。

for...in

js提供了枚举一个对象属性名的利器--for...in循环。

var dict={zhangsan:34,lisi:24,wangwu:62};var people=[];for(var name in dict){ people.push(name+":"+dict[name]);}people;//["zhangsan:34", "lisi:24", "wangwu:62"]

使用自定义对象

但一些自定义的对象还会继承其原型对象中的属性,for...in循环除了枚举"自身"属性外,原型链中的属性也不会放过。下面看一下例子

function NaiveDict(){ }NaiveDict.prototype.count=function(){ var i=0; for(var name in this){   i++; } return i;};NaiveDict.prototype.toString=function(){ return '[Object NaiveDict]';};var dict=new NaiveDict();dict.zhangsan=24;dict.lisi=34;dict.wangwu=62;dict.count();//5

上面的代码,实例化一个dict对象,并添加了私有属性(zhangsan,lisi,wangwu)并继承了原型对象的方法(toString,count),所以当调用count方法时,这个时候的for...in循环,不仅枚举了了私有属性也枚举了原型对象的方法属性(zhangsan,lisi,wangwu,toString,count)。

使用数组类型

利用js的灵活性,我们可以给任意的类型的对象添加属性,因此给数组添加属性似乎能工作。

var dict=new Array();dict.zhangsan=24;dict.lisi=34;dict.wangwu=62;dict.zhangsang;//24

当我们给数组的原型对象添加一些原型方法,也就是前面讲的猴子补丁ployfill的使用时,这个时候我们再枚举上面的dict对象的属性时,错误就出现了。

Array.prototype.first=function(){ return this[0];};Array.prototype.last=function(){ return this[this.length-1];};Array.prototype.eq=function(idx){ if(idx<0)idx=this.length+idx; return this[idx];};

运行一下枚举

var names=[];for(var name in dict){ names.push(name);}names;//["zhangsan", "lisi", "wangwu","first","last"]

轻量级字典的正确姿势

首要原则

应该仅仅将Object的直接实例作为字典,而不是子类,或其它对象。

原标题:[Effective JavaScript 笔记]第43条:使用Object的直接实例构造轻量级的字典

关键词:JavaScript

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。