今天临时有事,下午没有上课。
上午在讲node的stream的时候,提到Stream是一个抽象的接口。这个抽象该怎么描述呢?我是按我自己的理解来说的,虽然并不严谨与标准,但大方向应该是不会错。我是这样说的,
////////
人,都有双手双脚。
这是一个总体的普遍的描述,说的是一个类别,一个种类,一个群体的情况。这就是抽象的描述。
中国人,都是黄皮肤。
这是一个总体的全部的描述。这也是抽象的描述。
说,老尚这个人,特别的白。
这说的是群体当中的特定的个体。这就是具体的对象。
// 这就是一个抽象类
function 中国人(){
this.肤色 = '黄'
console.log( this.肤色 );
}
// 这是对上面的抽象的接口的一个实现。
var 老尚 = new 中国人();
老尚.肤色 = '特别白';
////////
那电饭锅又是怎么回事?是这样的,今天原本是想讲观察者模式,但查了一下资料,觉得不讲call,不太好讲观察者。因为这涉及到了对象的冒充替换。所以就先讲了call。我是先从一个现实生活中的例子开始讲起的,“我想借你家的电饭锅”。
业务需求是这样:“张xx,你有一个电饭锅。把它借我用一下,我要做饭。”
用js来描述这个需求的实现:
function 张xx(){
this.食物 = '菜'
this.电饭锅 = function(n){
console.log( this.食物 );
}
}
function 尚xx(){
this.食物 = '饭';
}
var z = new 张xx();
var s = new 尚xx();
z.电饭锅.call(s);
放心,这些代码都可以运行。应该还有人记得可以用中文写js吧,这样写只是比较好理解罢了。没什么实际意义。我总是跟我的学生们讲,“你们应该慢慢培养一种程序思维。就是用程序的逻辑与思维来看待现实生活中的事情。这种思维方式,也是无法被培训的。我只能告诉你们有这个东西,至于如何得到,只能靠你们自己。”
////////
call的定义和概念,我在这里就不写了,网上多的是,写在文章里没什么意思。
上面那段电饭锅的中文js,再进一步翻译成中文,就是这样:
1、用尚xx 来替换 张xx,替换了什么呢?
替换了作用域,
我家的厨房里,没有电饭锅。
替换之后,张xx的厨房 变成了 尚xx的厨房,
这个厨房,就是“作用域”。
2、然后调用原来 张xx中的方法,使用他的电饭锅。
就是调用了他的方法。
////////
同学们,读到这里,你明白call了吗?可以在留言里告诉我。