zoukankan      html  css  js  c++  java
  • 周道长浅谈鸭式辩型

    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()方法,

    这个方法内部实现和周道长刚出的绝招应该是一样的.

  • 相关阅读:
    windows下安装redis以及redis扩展,设置redis为windows自启服务
    Redis和Memcache的区别
    Git 简单入门使用
    ssh 连接 mac osx下 virtual box虚拟机中的 cent os 记录
    把可运行jar转换成Linux服务运行
    CentOS 7 配置FTP(vsftpd)
    团队总结
    第五周小组项目总结
    第四周小组项目总结
    第三周小组项目总结
  • 原文地址:https://www.cnblogs.com/zhoudaozhang/p/4684207.html
Copyright © 2011-2022 走看看