toString方法改造-使用正则匹配检测自定义对象类型

2015年6月21日00:00:50 发表评论 已收录

最近研究了多种关于toString 方法的自实现方式,下面分享一种可以完美检测出所有对象类型的方法,以供大家参考,如有错误,敬请指正!

var Person = function () {};
        Person.prototype.toString = function  () {
            return '[object Person]';
        };
        var p = new Person();

        /**
         * 判断构造函数是自己的还是内置的
         * 将 函数编程字符串, 检查函数体是否为 { [native code] }
         * var rnative = /{s*[s*native/;
         * rnative.test( 函数名 )
         */

        //获取Object对象的原型toString方法
        var toString = Object.prototype.toString;

        var type = (function  () {
            //定义两个正则匹配规则
            var rnative = /{s*[s*native/,
                rtype = /[object (.+)]/;
            //创建一个空的对象 用于缓存匹配检测过的对象数据
            var cache = Object.create( null );
            return function ( obj ) {
                var typeName, name;
                //获取传入对象的constructor属性值 与 定义好的正则规则匹配
                if ( rnative.test( obj.constructor ) ) {
                    //如果满足匹配规则 则使用自定义toString方法获取对象类型 并存储
                    typeName = toString.call( obj );
                } else {
                    //如果非自定义对象 则使用自定义原型对象的toString方法获取对象类型
                    typeName = obj.toString();
                }
                //如果缓存数据中已经存在typeName值
                if ( name = cache[ typeName ] ) {
                    //则直接返回name属性值
                    return name;
                }else{
                    //否则 将获取到的typeName属性值与定义好的正则进行匹配 获取最终的类型值
                    return cache[ typeName ] = rtype.exec( typeName )[ 1 ];
                }
            }
        })();

 

weinxin
我的微信
爱生活、爱学习的小伙伴可以通过扫一扫二维码添加我的个人微信一起交流!
青青子衿

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: