美文网首页
JavaScript设计模式与开发实践

JavaScript设计模式与开发实践

作者: qqqc | 来源:发表于2016-11-23 11:19 被阅读0次

第一部分 基础知识

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

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

相关文章

网友评论

      本文标题:JavaScript设计模式与开发实践

      本文链接:https://www.haomeiwen.com/subject/ikfupttx.html