第一部分 基础知识
第一章 面向对象的Javascript
JavaScript 通过原型委托的方式来实现对象与对象之间的继承。在语言层也没有提供对抽象类和接口的支持。
1.1 动态类型语言和鸭子类型
静态类型语言在编译时便确定变量的类型,动态类语言的变量类型要到程序运行时,待变量被赋予某个值后,才会具有某种类型。
JavaScript是一门动态类型语言。
动态类型语言对变量的宽容给实际编码带来了很大的灵活性。由于无需进行类型检测,我们可以尝试调用任何对象的任意方法,而无需去考虑它原本是否被设计为拥有该方法。
这一切都是建立在鸭子类型(duck typing)的概念上。鸭子类型的通俗说法是:如果它走起来像鸭子,叫起来也是鸭子,那么它就是鸭子。
模拟鸭子故事的代码
var duck = {
duckSinging: function(){
console.log('gagaga');
}
};
var chicken = {
duckSinging: function(){
console.log('gagaga');
}
};
var choir = [ ]; //合唱团
var joinChoir = function ( animal ){
if( animal && typeof animal.duckSinging === 'function'){
choir.push(animal);
console.log('恭喜加入合唱团');
console.log('合唱团已有成员数量:' + choir.length);
}
};
joinChoir( duck ); //恭喜加入合唱团
joinChoir( chicken ); //恭喜加入合唱团
对于加入合唱团的动物,大臣们无需检查它的类型,只需要保证他们拥有duckSinging方法即可。
1.2多态(polymorphism) 复数的形态
含义:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。意思是,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈
1.2.1 一段“多态”的JavaScript代码
var makeSound = function( animal ){
if( animal instanceof Duck ){
console.log('gagaga');
}else if ( animal instanceof Chicken ){
console.log('lololo');
}
};
var Duck = function(){};
var Chicken = function(){};
makeSound ( new Duck ); //gagaga
makeSound ( new Chicken ); //lololo
这段代码如果要增加狗,则要改动makeSound函数,当动物越来越多,makeSound有可能变成一个巨大的函数
1.2.2 对象的多态性
下面是改写后的代码,首先我们把不变的部分隔离出来,那就是所有的动物都会发出声音:
var makeSound =function ( animal ){
animal.sound();
};
然后把可变的 部分各自封装起来,我们刚才谈到的多态性实际上指的是对象的多态性:
var Duck = function (){}
Duck.prototype.sound =function(){
console.log('gagaga');
};
var Chicken =function(){}
Chicken.prototype.sound=function(){
console.log('lololo');
};
makeSound( new Duck() ); //gagaga
makeSound( new Chicken ); //lololo
加一个狗的叫只需加一段代码,而不需要改动以前的makeSound函数
var Dog =function(){}
Dog.prototype.sound=function(){
console.log('wnwnwn');
};
makeSound( new Dog() ) //wnwnwn
1.2.3 类型检查和多态
JavaScript是一门不必进行类型检查的动态类型语言。
作者举的java实例看不懂。
1.2.4 使用继承得到多态效果
作者举的java实例看不懂。
1.2.5JavaScript的多态
多态的思想实际上是把“做什么”和“谁去做”分离开,要实现这一点,归根结底先要消除类型之间的耦合关系。如果类型之间的耦合关系没有被消除,那么我们在makeSound方法中指定了发出叫声的对象是某个类型,它就不能被替换为另一个类型。在Java中,可以通过向上转型来实现多态。而在JavaScript中则不需要。
1.2.6 多态在面向对象程序设计中的作用
在电影的拍摄现场,当导演喊出“action”时,主角开始背台词,照明师负责打灯光,后面的群众演员假装中枪倒地,道具师往镜头里撒上雪花。在得到同一个消息时,每个对象都知道自己应该做什么。如果不利用对象的多态性,而是用面向过程的方式来编写这一段代码,那么相当于在电影开始拍摄之后,导演每次都要走到每个人的面前,确认它们的职业分工(类型),然后告诉他们要做什么。如果映射到程序中,那么程序中将充斥着条件分支语句。
利用对象的多态性,导演在发布消息时,就不必考虑各个对象接到消息后应该做什么。对象应该做什么并不是临时决定的,而是已经事先约定和排练完毕的。每个对象应该做什么,已经成为了该对象的一个方法,被安装在对象的内部,每个对象负责它们自己的行为。所以这些对象可以根据同一个消息,有条不紊地分别进行各自的工作。