俊哥的blog的一道题

题目:

实现一个person对象,有eat和dinner两种方法

请用实例【依次类推】

new person('Tom').sleep(10).eat('dinner');

//输出 console.log("hello Tom");

//等待10s后输出
console.log("sleep 10s");
console.log("eat dinner");

看似是实现一个对象上面方法的链式调用(一般都是在前一个方法的调用,该题目的sleep的调用,return this);然后就可以进行链式调用。先来一个没有等待时间的链式调用,如下:

var person = function(name){
      this.name = name;
      console.log(`hello ${name}`);
      this.sleep = function(time){
          console.log(`no sleep`);
          return this;
     }
    this.eat = function(food){
          console.log(`eat  ${food}`);
     }
}

new person("Tom").sleep(10).eat("dinner");

 

Thus,要在sleep的方法里面实现等待10s后进行输出肯定是要有一个延迟,该延迟完成后方可继续eat的执行,因此可以利用ES6的promise,给该对象加入一个新的promise属性,在sleep里面进行赋值并返回,在eat方法中进行promise.then对象的调用。代码如下:

var  person = function(name){
    this.name = name;
    console.log(`hello ${name}`);   
}
person.prototype.sleep = function(time){
    this.promise = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log(`sleep ${time}s`);
            resolve();
        },time*1000);
    })
    return this;
}
person.prototype.eat = function(food){
        this.promise.then(res=>{
            console.log(`eat ${food}`);
        })
}
new person("Tom").sleep(10).eat("dinner");
//即可实现原题的返回结果

 其实这道题最开始可以使用回调函数方法实现,只不过原理大致相同,主要还是在sleep方法里面加入了一个属性方法,在eat方法里面延迟sleep的属性方法,进行返回。

var person = function(name){
    this.name = name;
    console.log(`hello ${this.name}`);
}
person.prototype.sleep = function(time){
    var _self = this;
    this.cb = function(fn){
        setTimeout(function(){
            console.log(`sleep ${time}s`);
            fn()
        },1000*time)
    }
    return this;
}
person.prototype.eat = function(food){
    this.cb(function(){
        console.log(`eat ${food}`);
    }) 
    return this;
}
new person('Tom').sleep(10).eat('dinner');

【完】

“须菩提,于意云何?可以身相见如来不?”

 “不也,世尊。不可以身相得见如来。何以故?如来所说身相,即非身相。”

  佛告须菩提:“凡所有相,皆是虚妄。若见诸相非相,即见如来。”

 

 

 

posted @ 2018-04-28 17:38  tangjiao_Miya  阅读(209)  评论(0编辑  收藏  举报