多态(Polymorphism)按字面的意思就是“多种状态”,同样的行为(方法)在不同对象上有不同的状态。
  在OOP中很多地方都要用到多态的特性,比如同样是点击鼠标右键,点击快捷方式、点击桌面空白处、点击任务栏等弹出的菜单都是不同的。

方法重写(override):

  即子类定义一个与父类名字相同的方法,以此覆盖父类方法,以此来实现不同的功能。

     function Animal(){}
var AnimalP = Animal.prototype;
AnimalP.eat = function(food){
console.log('这个动物正在吃' + food);
}; function Snake(){}
var SnakeP = extend(Snake,Animal);//extend函数请看上一节
/*snake没有对eat方法重写,继承的父类eat()方法*/
function Dog(){}
var DogP = extend(Dog,Animal);
DogP.eat = function(food){
/*对eat()方法重写*/
/*上一章讲过,也可以在这里通过 Animal.eat.call(this,food)调用父方法;*/
console.log("这只狗正在吃"+food);
}; function Cat(){}
var CatP = extend(Cat,Animal);
CatP.eat = function(food){
console.log("这只猫正在吃"+food);
};
var snake = new Snake();
snake.eat('老鼠');//log:这个动物正在吃老鼠
var dog = new Dog();
dog.eat('骨头');//log:这只狗正在吃骨头
var cat = new Cat();
cat.eat('鱼');//log:这只猫正在吃鱼

抽象类(abstract class):

  上面的代码中,Snake类没有实现自己的eat()方法,但有的时候我们希望子类一定要有某个方法(抽象方法),这样可以规范子类的行为,这时候就要用到抽象类,
  ES5、ES6都没有抽象类的概念的,所以我们只能通过模拟来实现,让我们接着上面的代码,假如我们要把Animal的eat()方法定义为抽象方法:

     AnimalP.eat = function(food){
/*定义抽象方法(虚函数),如果子类没有重写这个方法,在执行这方法的时候就会抛出错误*/
throw '"' + this.constructor.name + "'类没有eat()方法";
};
function Snake(){}
var SnakeP = extend(Snake,Animal);
var snake = new Snake();
snake.eat('老鼠');//throw:"Snake'类没有eat()方法

方法重载(overload):

  我们一定写过这样的函数,根据传入的参数不一样(类型、参数个数),方法的运行结果也不一样:

 var run = function(speed){
if(typeof speed == 'number'){
console.log('跑的速度有' + speed + 'm/s');
}else if(typeof speed == 'string'){
console.log('跑的速度有' + speed);
}
}
run(15);//log:跑的速度有15m/s
run('20KM/h');//log:跑的速度有20KM/h

   但上面这样写明显代码难维护,可以把run方法作为一个接口,根据参数的类型执行不同方法,用在类中就向下面一样:

     function Dog(){}
var DogP = Dog.prototype;
DogP.run = function(speed){
if(typeof speed == 'number'){
this._runNumber(speed);
}else if(typeof speed == 'string'){
this._runString(speed);
}else{
throw '参数不匹配';
}
}
DogP._runString = function(speed){
console.log('这只狗跑的速度有' + speed);
}
DogP._runNumber = function(speed){
console.log('这只狗跑的速度有' + speed + 'm/s');
}
var dog = new Dog();
dog.run(15);//log:这只狗跑的速度有15m/s
dog.run('20KM/h');//log:这只狗跑的速度有20KM/h
dog.run([]);//throw:参数不匹配

  这就是方法重载的模拟,但实际上,ES5、ES6、typescipt都不支持语法上的方法重载,typescipt也只是支持函数重载。
  这是多态的另一种实现方式。

Demo by ES6:

     class Animal{
eat(food){
throw '"' + this.constructor.name + "'类没有eat()方法";
}
}
class Snake extends Animal{}
class Dog extends Animal{
eat(food){
console.log("这只狗正在吃"+food);
}
}
class Cat extends Animal{
eat(food){
console.log("这只猫正在吃"+food);
}
}
let snake = new Snake();
snake.eat('老鼠');//throw:"Snake'类没有eat()方法
let dog = new Dog();
dog.eat('骨头');//log:这只狗正在吃骨头
let cat = new Cat();
cat.eat('鱼');//log:这只猫正在吃鱼

Demo by TypeScript:

 abstract class Animal{//定义抽象类Animal
constructor(){}
abstract eat(food: string){}
/*定义抽象方法eat(),并且限定传入的参数类型是string,
还可以定义返回值,接口等,如果子类不符合限定的规范,编译的时候就会报错。
*/
}
class Snake extends Animal{}//报错,无法通过编译,因为没有定义eat()抽象方法
class Dog extends Animal{
eat(food: string){
console.log("这只狗正在吃"+food);
}
}
class Cat extends Animal{
eat(food: string){
console.log("这只猫正在吃"+food);
}
}
let dog = new Dog();
dog.eat('骨头');//log:这只狗正在吃骨头
let cat = new Cat();
cat.eat('鱼');//log:这只猫正在吃鱼

后话

  如果你喜欢作者的文章,记得收藏,你的点赞是对作者最大的鼓励;

  面向对象的主要知识点在这里就讲完了,这些东西仅仅是基础,我讲的肯定不够完善,仅仅是为了让大家快速入门,建议大家有时间的话还是系统的看书学习一下js OOP;

  本系列还有最后一章,会把前几张讲的知识点通过一个案例整合在一起,让大家可以更好的消化吸收,大概会酝酿两周的时间;

  大家有什么疑问可以留言或私信作者,作者尽量第一时间回复大家;

  如果老司机们觉得那里可以有不恰当的,或可以表达的更好的,欢迎指出来,我会尽快修正、完善。

JavaScript面向对象轻松入门之多态(demo by ES5、ES6、TypeScript)的更多相关文章

  1. JavaScript面向对象轻松入门之封装(demo by ES5、ES6、TypeScript)

    本章默认大家已经看过作者的前一篇文章 <JavaScript面向对象轻松入门之抽象> 为什么要封装? 封装(Encapsulation)就是把对象的内部属性和方法隐藏起来,外部代码访问该对 ...

  2. JavaScript面向对象轻松入门之概述(demo by ES5、ES6、TypeScript)

    写在前面的话 这是一个JavaScript面向对象系列的文章,本篇文章主要讲概述,介绍面向对象,后面计划还会有5篇文章,讲抽象.封装.继承.多态,最后再来一个综合. 说实话,写JavaScript面向 ...

  3. JavaScript面向对象轻松入门之继承(demo by ES5、ES6)

    继承是面向对象很重要的一个概念,分为接口继承和实现继承,接口继承即为继承某个对象的方法,实现继承即为继承某个对象的属性.JavvaScript通过原型链来实现接口继承.call()或apply()来实 ...

  4. JavaScript面向对象轻松入门之抽象(demo by ES5、ES6、TypeScript)

    抽象的概念 狭义的抽象,也就是代码里的抽象,就是把一些相关联的业务逻辑分离成属性和方法(行为),这些属性和方法就可以构成一个对象. 这种抽象是为了把难以理解的代码归纳成与现实世界关联的概念,比如小狗这 ...

  5. JavaScript面向对象轻松入门之综合

    javascrpit面向对象之综合   这一章是对前几章的一个总结,通过一个案例来综合认识javascript面向对象的基本用法   需求: 几乎所有的web应用都需要保存数据一些到本地,那么我们就来 ...

  6. javascript面向对象:继承、多态

    继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属性),同时可扩展自己的成员,下面介绍几种js中实现继承的方式: 1,对象模仿:通过动态的改变 this 指针的指向,实现 ...

  7. JavaScript面向对象编程入门

    来源极客网 function Person() { var _this = {} //创建一个空的对象,接着我们利用这个"空的对象"承载Person的属性和方法 _this.say ...

  8. JavaScript 面向对象程序设计(下)——继承与多态 【转】

    JavaScript 面向对象程序设计(下)--继承与多态 前面我们讨论了如何在 JavaScript 语言中实现对私有实例成员.公有实例成员.私有静态成员.公有静态成员和静态类的封装.这次我们来讨论 ...

  9. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

    转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...

随机推荐

  1. VR全景加盟-了解VR就来全景智慧城市

    关于什么是真正的VR说了这么多,面对刚刚起步的VR,如何辨别判断一个真正的VR形式呢.除了我们所说几个参数或者大家关注的眩晕感.临场感,真正的VR究竟带给大家什么样的特性呢?这个就要从VR的本质谈起. ...

  2. jsp中的request.setAttribute的使用

    1.第一个jsp页面 <form id="form1" method="post" action="first.jsp"> &l ...

  3. 主java程序猿知识体系结构

    zuoxiaolong博客园<浅谈程序猿书箱的选择,你会如何选择自己的爱书呢>一文,链接如下:http://www.cnblogs.com/zuoxiaolong/p/life19.htm ...

  4. 025 hibernate悲观锁、乐观锁

    Hibernate谈到悲观锁.乐观锁,就要谈到数据库的并发问题,数据库的隔离级别越高它的并发性就越差 并发性:当前系统进行了序列化后,当前读取数据后,别人查询不了,看不了.称为并发性不好 数据库隔离级 ...

  5. 彻底清除Linux centos minerd木马

    前几天,公司两台linux服务器,一台访问速度很慢,cpu跑满,一台免密码登录失效,公钥文件被改写成redis的key.用htop命令查询发现了minerd木马进程,初步猜测是redis没有配访问权限 ...

  6. java-web中生成文档(一)

    基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样 ...

  7. 【2017-06-01】Linq基础+Lambda表达式实现对数据库的增删改查

    一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net.省去了自己敲代码的实体类和数据访问类的大量工作. 实体类: 添加一个Linq to sql 类 -- ...

  8. (整理)使用tomcat搭建HTTP文件下载服务器

    本文是整理,非原创,由网络资料组成上自己踩的坑整理而成. 1. 假设需要下载的文件目录是D:\download1(注意这里写了个1,跟后面的名称区分) 2. 设置 tomcat 的虚拟目录.在 {to ...

  9. PHP 获取系统信息,PHP 获取服务器详细信息

    获取系统类型及版本号:    php_uname()                                   (例:Windows NT COMPUTER 5.1 build 2600)只 ...

  10. Vue2.0 从零开始--搭建环境

    简要:继项目空闲后,开始着手vue的学习;为此向大家分享其中的艰辛和搭建办法,希望能够跟各位VUE大神学习探索,如果有不对或者好的建议告知下:*~*! 一.什么是VUE? 是一种node.js框架,特 ...