面向对象语言有三大特征,前面介绍了封装和继承,那么JS作为一门面向对象语言,有多态么,又怎么实现多态呢?

我们先看看多态的概念:

多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

PS(多态其实是强类型结的果,而对于JS这种本身就是【弱类型】的语言来说,多态是与生俱来的,或者说根本就不需要这个概念。比如同一个“+”在字符串之间、数值之间执行不同的运算,就是一种多态。)

那么严格意义的多态怎么实现呢

多态最常见的三中方式

  • 重写
  • 重载
  • 接口

重写指子类重新定义父类方法,这正好就是基于prototype继承的玩法

function aaron(){}
aaron.prototype.say=function(){
alert("hi");
}
function aaron1(){
this.say=function(){
alert("hello");
}
}
aaron1.prototype=new aaron();
var ni=new aaron1();
ni.say();

重载是指多个同名但参数不同的方法,这个JavaScript确实没有,但是我们可以绕个大弯来实现,根据arguments来判断参数个数和类型,然后再函数体中分情况执行不同的代码。

bar1 = function ( a ) { console.log( a ) };

bar2 = function ( a, b ) { console.log( a + b ) } 

foo = function () {
if ( arguments.length === 1 ) {
bar1.apply(null, arguments)
}
if ( arguments.length === 2 ) {
bar2.apply(null, arguments)
}
}

  接口我们也可以曲线来实现,把接口需要实现的方法都抛出异常,如果没有被实现就会报错。

//interface
function Parent() {
this.print = function(){throw 'No implementation';};
} function ChildA() {
this.print = function(){alert('ChildA');};
}
ChildA.prototype = new Parent(); function ChildB() {
this.print = function(){alert('ChildB');};
}
ChildB.prototype = new Parent(); function ChildC() {}
ChildC.prototype = new Parent(); var p = new ChildA();
p.print(); p = new ChildB();
p.print(); p = new ChildC();
p.print();

  结语:js原生实现的多态就只有函数重写,其他的形式可以通过某些技巧来模拟。

JS多态的更多相关文章

  1. 三言两语之js面向对象初探1

    http://www.cnblogs.com/54td/p/5580994.htm    先是有了这个比较简短但是内容比较丰盈的上篇,现在时间比较充沛,所以详细写来.搞前端的同学经常被其他程序员bs, ...

  2. 初了解JS设计模式,学习笔记

    什么是设计模式. 回答这个问题,往往我们得先知道我们为什么需要设计模式,正是因为有需求才会有设计模式,难道不是吗? 我们为什么需要设计模式. 如果没有按照设计模式去写,你的代码很可能是乱无肆忌写的,也 ...

  3. Javascript设计模式学习一

    学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...

  4. JavaScript之函数(上)

    在编程语言中,无论是面向过程的C,兼备面过程和对象的c++,还是面向对象的编程语言,如java,.net,php等,函数均扮演着重要的角色.当然,在面向对象编程语言JavaScript中(严格来说,J ...

  5. [转] JS中简单的继承与多态

    这里讲了一个最最最简单的JS中基于原型链的继承和多态. 先看一下以下这段代码的实现(A是“父类”,B是“子类”): var A = function(){ this.value = 'a'; this ...

  6. js中实现多态

    最近读到一本书<JavaScript设计模式与开发实践>上,讲到js的多态,我在JavaScript高级程序编程里貌似都没有见过关于这个的详细讲解,所以想问问大家有没有什么推荐的文章或者博 ...

  7. js中的封装、继承、多态

    Javascript是一门解释型的语言,是基于对象的,并不是真正的面向对象的语言,对变量类型的应用也是宽松的,其实它同样可以模拟面向对象的功能:  1 function myfun1(){  2    ...

  8. JS实现继承多态

    //类对象构造模版,无new访问,类似静态访问 var Class = { create: function () { return function () { //initialize初始化 //a ...

  9. JS面向对象编程之:封装、继承、多态

    最近在实习公司写代码,被隔壁的哥们吐槽说,代码写的没有一点艺术.为了让我的代码多点艺术,我就重新温故了<javascript高级程序设计>(其中几章),然后又看了<javascrip ...

随机推荐

  1. Python爬取17吉他网吉他谱

    最近学习吉他,一张一张保存吉他谱太麻烦,写个小程序下载吉他谱. 安装 BeautifulSoup,BeautifulSoup是一个解析HTML的库.pip install BeautifulSoup4 ...

  2. Ext.QuickTips.init();

    在Extjs的组件需要提示框时往往需要此语句. 首先,Ext.QuickTips是什么? 在Ext JS 4.2.0 的API中可以查到,注意在其他的Extjs版本以下查不到,这是因为在其他版本Ext ...

  3. 1842-A. Broj

    #include <iostream> using namespace std; int main() { int n; cin>>n; if(n>0&& ...

  4. eclipse, Log4j配置(真心的详细~)

    转自: http://www.cnblogs.com/alipayhutu/archive/2012/06/21/2558249.html a). 新建Java Project>>新建pa ...

  5. html5 飞船动画

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  6. hadoop 原理: 浅析Hadoop文件格式

    Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非 为特定目的而建,因此序列化和反 ...

  7. [Hadoop源码解读](一)MapReduce篇之InputFormat

    平时我们写MapReduce程序的时候,在设置输入格式的时候,总会调用形如job.setInputFormatClass(KeyValueTextInputFormat.class);来保证输入文件按 ...

  8. 加快VisualStudio的开发速度--VS的一些开发技巧

    最近不得不使用VisualStudio来进行一些开发,用习惯了Eclipse,感觉VS很难上手,不过通过google,把VS进行Eclipse化,顺便记录下来,以防忘记. 1)显示文字的自动完成. 改 ...

  9. 使用vs2010进行驱动开发的补充

    看到前面的一篇文章 ,在这里http://www.cnblogs.com/wubiyu/archive/2010/05/17/1737420.html vs2010配置驱动开发基本上按照如上所说就差不 ...

  10. 保持与 Microsoft Azure Files 的连接

    我们在最近的博客文章中介绍了 Azure StorageFiles的预览版,请单击此处.该文章包含 Azure Files 的相关信息,说明了如何申请预览版并开始使用,还介绍了一些有助于创建共享和传 ...