俊哥的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');
【完】
“须菩提,于意云何?可以身相见如来不?”
“不也,世尊。不可以身相得见如来。何以故?如来所说身相,即非身相。”
佛告须菩提:“凡所有相,皆是虚妄。若见诸相非相,即见如来。”