您的位置:首页 > 其它

周道长浅谈鸭式辩型

2015-07-28 20:05 148 查看
Javascript中的鸭式辩型(duck-type):会游泳,会嘎嘎叫,有两条腿的就是鸭子,比如你。

废话少说,直接上一段代码

var iframe=document.createElement("iframe");

document.body.appendChild(iframe);

var xArray=window.frames[window.frames.length-1].Array;

var arr=new xArray(1,2,3);

alert(arr instanceof Array); //false

alert(arr.constructor===Array); //false

what gui? arr 明明是一个数组,为什么两种方式检测都弹出false?

谷歌一下,哦,原来跨frame实例化的对象不共享原型链.

那么咱用鸭式辩型的思想来造一个方法isShuzu来看看他是不是数组。

废话少说,上代码(代码说:我好无辜啊啊啊)。

function isShuzu(object){

return object!=null&&typeof object=="object"&&

'splice' in object&&'join' in object;

}

alert(isShuzu(arr)); //true

因为arr有数组特有的方法splice和join,又也是一个object,

那么他就是一个数组,弹出了true。不明觉厉啊!!

但是,下面我们来造一个名字叫 “鸡" 的对象。

var ji={ name:"鸡" , splice:"我也有splice" , join:"我也有join" ,speak:"我是不是数组呢?"};

alert(isShuzu(ji)); //true

因为 ji 有数组特有的方法splice和join,又也是一个object,

那么他就是一个数组,弹出了true。额,鸭式辩型傻傻分不清真假数组了。

下面,周道长使出绝招,上代码

alert( Object.prototype.toString.call(ji) === '[object Array]' ); //false

哈哈哈,周道长一眼就看出 ji 不是数组。

总结一下,在Javascript中判断对象是不是数组推荐Array.isArray()方法,

这个方法内部实现和周道长刚出的绝招应该是一样的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: