手写一个同时支持的函数式和面向对象两种用法underscore.js的实现

(function(){
     var _=function(obj){
         if(this instanceof _){return obj;}
         if(!(this instanceof _)){return new _(obj);}
     }
        var root=this;
        root._=_;
    
        _.log=function(){
            console.log(123);
        }
        _.isFunction=function(obj){
            return typeof obj=='function';
        }
        _.function=function(obj){
            var names=[];
            var key;
            for(key in obj){
                if(_.isFunction(obj[key])){
                    names.push(key);
                }
            }
            return names.sort();
        }
        _.each=function(obj,callback){
            var len,i=0;
            if (obj.__proto__.constructor==Array) {
                len=obj.length;
                for(;i<len;i++){
                    callback.call(obj[i],obj[i]);
                }
            }
        }
        _.mixin=function(obj){
            _.each(_.function(obj),function(name){
                var func=obj[name];
                _.prototype[name]=function(){
                    return func.apply(_);
                }
            });
        }
        /*自定义方法开始*/
        
        /*自定义方法结束*/
        _.mixin(_);
        console.log(_.function(_));

    
}.call(this))
_().log();//函数式调用

var obj = new _();
obj.log();//面向对象调用

如何新增方法,比如新增一个sayHello的方法

在自定义方法开始和自定义方法结束之间插入以下代码

    _.sayHello=function(){
        console.log('Hello');
    }

然后可以通过以下代码调用

_().sayHello();//函数式调用

var obj = new _();
obj.sayHello();//面向对象调用

邱权武
36 声望6 粉丝

15岁开始程序开发,第一个用到的语言是VB,后续6年相继学习c#,Java,PHP,python,JavaScript,node.js等语言,掌握oracle,mysql,mongoDB等主流数据库系统。现在是一名计算机语言教育工作者,同时是一名全栈工...