JavaScript设计模式与开发实践

第一部分 基础知识

第一章 面向对象的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”时,主角开始背台词,照明师负责打灯光,后面的群众演员假装中枪倒地,道具师往镜头里撒上雪花。在得到同一个消息时,每个对象都知道自己应该做什么。如果不利用对象的多态性,而是用面向过程的方式来编写这一段代码,那么相当于在电影开始拍摄之后,导演每次都要走到每个人的面前,确认它们的职业分工(类型),然后告诉他们要做什么。如果映射到程序中,那么程序中将充斥着条件分支语句。

利用对象的多态性,导演在发布消息时,就不必考虑各个对象接到消息后应该做什么。对象应该做什么并不是临时决定的,而是已经事先约定和排练完毕的。每个对象应该做什么,已经成为了该对象的一个方法,被安装在对象的内部,每个对象负责它们自己的行为。所以这些对象可以根据同一个消息,有条不紊地分别进行各自的工作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容