前端面试题----js实现LazyMan

LazyMan(“Hank”).sleep(10).eat(“dinner”)

实现一个LazyMan,可以按照以下方式调用:
LazyMan(“Hank”)输出:
Hi! This is Hank!
LazyMan(“Hank”).sleep(10).eat(“dinner”)输出
Hi! This is Hank!
//等待10秒…
Wake up after 10
Eat dinner~
LazyMan(“Hank”).eat(“dinner”).eat(“supper”)输出
Hi This is Hank!
Eat dinner~
Eat supper~
LazyMan(“Hank”).sleepFirst(5).eat(“supper”)输出
//等待5秒
Wake up after 5
Hi This is Hank!
Eat supper
以此类推。

方法实现

(function(window, undefined){
  var taskList = [];
  // 订阅方法
  function subscribe(){
    var param = {},
        args = Array.prototype.slice.call(arguments);
    if( args,length < 1 ){
      throw new Error("subscribe 参数不能为空");
    }
    param.msg = args[0]; //消息名
    param.args = args.slice(1);

    if( param.msg == "sleepFirst" ){
      taskList.unshift(param);
    }else{
      taskList.push(param);
    }

    //发布方法
    function publish(){
      if( taskList.length > 0 ){
        return(taskList.shift());
      }
    }

    // 实现lazyMan的类
    function LazyMan(){};

    lazyMan.prototype.eat = function ( str ){
      subscribe("eat", str)
      return this;
    }

    lazyMan.prototype.sleep = function (num){
      subscribe("sleep", num)
      return this;
    }

    lazyMan.prototype.sleepFirst = function (num){
      subscribe("sleepFirst", num);
      return this;
    }

    // 输出log包装方法
    function lazyManLog (str){
      console.log(str);
    }

    // 具体执行
    function lazyMan(str){
      lazyManLog("Hi! This is " + str + "!");
      publish();
    }

    function eat(str){
      lazyManLog("Eat " + str + "~");
      publish();
    }

    function sleep(num){
      setTimeout(function(){
        lazyManLog("Wake up after " + num);
      }, num*1000)
    }

    function sleepFirst(num) {
      setTimeout(function(){
        lazyManLog("Wake up after " + num);
      },num)
    }

    // 执行run方法
    function run(option){
      var msg = option.msg;
          args = option.args;
      switch(msg){
        case "lazMan": lazyMan.apply(null, args); break;
        case "eat": eat.apply(null, args); break;
        case "sleep": sleep.apply(null, args); break;
        case "sleepFirst": sleepFirst.apply(null, args); break;
        default:;
      }
    }

    //暴露接口给window
    window.LazyMan = function(str){
      subscribe("lazyMan", str);
      setTimeout(function(){
        publish();
      },0)
      return new LazyMan();
    }

  }
}(window))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值