js是面向对象语言,但是js又缺乏了面向对象的诸多特性,比如继承,没有接口继承也没有父类继承,因此有时候需要人工来实现继承。

一、首先看下java中面向对象的继承:

//定义类鸟类的飞行动作
interface BirdFlyable {
public void fly();
}
//鸟类
class Bird implements BirdFlyable{
public void fly(){
System.out.println("bird is flying");
}
}
//蝙蝠同样可以飞行,不过没有继承鸟类的动作
class Bianfu{
public void fly(){
System.out.println("Bianfu is flying");
}
} public class Test{
//定义fly方法,要求传入鸟类飞行方法
public void fly(BirdFlyable flyable){
flyable.fly()
}
public static void main(String[] args) {
Bird bird=new Bird();
fly(bird);//bird is flying
//Bianfu bianfu=new Bianfu();
//fly(bianfu) //执行蝙蝠方法,报错
}
}

此处可以看到fly(bird)执行结果为bird is flying,如果Bird继承了BirdFlyable却没有实现fly方法,会在编译时候报错,相反,如果使用fly(bianfu),因为蝙蝠没有继承接口,同样也会报错,因此java中的接口继承为严格的继承。

二、python继承

#定义鸟类飞行方法
class BirdFlyable():
def fly(self):
pass
#定义鸟类
class Bird(BirdFlyable):
def fly(self):
print('bird is flying') #定义蝙蝠
class Bianfu():
def fly(self):
print('Bianfu is flying') #增加方法,希望传入鸟类飞行方法
def fly1(birdFlyable):
birdFlyable.fly(); #事实证明,传入蝙蝠也是可以的
fly1(Bird())#bird is flying
fly1(Bianfu())#bird is flying

在python中因为方法中的参数没有明确规定类型,因此只要执行时候含有此方法,即可完成功能。

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

三、js中实现接口

目前js中实现接口有三种方法:

1、文档注释,即预先在文档注释中写好接口,规定接口中的方法,开发人员根据注释编写接口,此方法其实用处不大,无法强制开发人员继承接口。

2、属性检测法:在定义类的时候,规定类继承了哪几个接口,此方法只能检测接口名称,不能检测具体实现方法。

3、鸭式辩型法:与python中一样,来源与“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子的理论,重点关注类实现了哪些方法,而忽略继承了那个接口,从而判断类的继承,实现方法如下:

    //鸭式辩型法  实现javascript接口最完美的方法
//核心方法是检测是否实现了接口的每一个方法
//面向对象,代码实现统一,也解耦了 //1、接口类
/**
*接口需要两个参数,1、名字,2、抽象方法名称数组
*/
var Interface=function(name,methods){
//如果参数大于一个,且第二个参数为数组,否则抛出异常
if(arguments.length>=2&&(arguments[1] instanceof Array)){
this.name=name;
this.methods=[];
for(var index in methods){
if(typeof methods[index]=='string'){
this.methods.push(methods[index]);
}else{
throw new Error('方法名应该是字符串')
}
}
}else{
throw new Error("接口需要两个参数,1、名字,2、抽象方法名称数组");
}
} //定义两个接口,分别为增删改查
var interface1=new Interface('interface1',['add','delete']);
var interface2=new Interface('interface2',['modify','query']); /**
*定义接口检验类,主要检验是否实现了接口中的所有方法
*接口中传递参数为:1、需要检测的类,2、其他接口参数
*/
Interface.checkInterface=function(object){
if(arguments.length>=2){
for(var i=1,len=arguments.length;i<len;i++){
//获取需要检测的接口
var interface=arguments[i];
//获取接口中所含的所有方法
for(var j=0,methods=interface.methods;j<methods.length;j++){
var method=methods[j];
if(!object[method]||(typeof object[method]!='function')){
throw new Error("方法"+method+"没有实现");
} }
}
}else{
throw new Error('接口检验错误,参数至少两位')
}
} //定义From类
//实现接口1和接口2中的方法
function Form(){
this.add=function(){
alert('add');
};
this.delete=function(){
alert('delete')
};
this.modify=function(){
alert('modify')
};
this.query=function(){
alert('query')
}
}
//实例化类
var form =new Form();
//做借口检查
Interface.checkInterface(form,interface1,interface2)
form.add();

[技术学习]js接口继承的更多相关文章

  1. C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )

    你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )   一个家庭 相当于 一个空间,这个空间里 有 很多元素,比如 爱,爱这个抽象事物,可能有很多动作,接吻.交流,对于一 ...

  2. [技术学习]js继承

    今天又看了一遍js的面向对象方面的知识,重点看了继承相关内容,已经记不得看了第几次这个内容,终于觉得自己好像懂了,特记录下来过程. js面向对象继承分为两大类,主要分为对象继承和非对象继承(拷贝继承) ...

  3. [技术学习]js正则表达式汇总

    一.常用正则表达式关键字 ".":任意字符 "*":任意个数 "+":任意个数,至少一个 "?":0-1个 " ...

  4. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  5. No2_1.接口继承多态_Java学习笔记_接口

    接口.继承与多态 1.继承和多态是面向对象开发语言中的重要一个环节,使用得当,可以将整个程序的架构变得非常有弹性,减少代码冗余: 2.继承:复用定义好的类: 3.多态:可以动态调整对象的调用,降低对象 ...

  6. 实现简单的PHP接口,以及使用js/jquery ajax技术调用此接口

    主要介绍下如何编写简单的php接口,以及使用js/jquery的ajax技术调用此接口. Php接口文件(check.php): <?php $jsonp_supporter = $_GET[‘ ...

  7. No2_4.接口继承多态_Java学习笔记_经典案例

    import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import jav ...

  8. Python学习第十八课——继承,接口继承等

    1.继承:字面意思 # 继承 : 字面意思 class father: pass class grandfather: pass class children(father): # 单继承 pass ...

  9. [Java Tutorial学习分享]接口与继承

    目录 接口 概述 Java 中的接口 使用接口作为API 定义一个接口 The Interface Body 实现接口 使用接口作为类型 进化的接口 默认方法 扩展包含默认方法的接口 静态方法 接口总 ...

随机推荐

  1. 关于java中Double类型的运算精度问题

    标题     在Java中实现浮点数的精确计算    AYellow(原作) 修改    关键字     Java 浮点数 精确计算   问题的提出:如果我们编译运行下面这个程序会看到什么?publi ...

  2. 【hadoop2.6.0】利用JAVA API 实现数据上传

    原本的目的是想模拟一个流的上传过程,就是一边生成数据,一边存储数据,因为能用上HADOOP通常情况下原本数据的大小就大到本地硬盘存不下.这一般是通过把数据先一部分一部分的缓冲到本地的某个文件夹下,hd ...

  3. $.each 和$(selector).each()的区别

    $.each() 对数组或对对象内容进行循环处理 jQuery.each( collection, callback(indexInArray, valueOfElement) ) collectio ...

  4. osg四元数设置roll pitch heading角度

    roll绕Y轴旋转 pitch绕X轴旋转 heading绕Z轴旋转 单位是弧度,可以使用osg::inDegrees(45)将45角度转换为弧度 定义一个四元数 osg::Quat q( roll,o ...

  5. !带有指针的类和struct赋值的本质 - host to device

    //这个变量必须在while循环外面 //原因是当将loadModels[modelNum].g_3DModel[0]赋值给新建类后 //里面的数值拷贝过去了,而里头的指针只给了地址 //所以如果这个 ...

  6. hdu2302(枚举,大数取模)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2303 题意:给出两个数k, l(4<= k <= 1e100, 2<=l<=1 ...

  7. DB2 for Z/os Statement prepare

    The PREPARE statement creates an executable SQL statement from a string form of the statement. The c ...

  8. Java之POJO

    转: POJO    一:什么是POJOPOJO的名称有多种,pure old java object .plain ordinary java object 等.按照Martin Fowler的解释 ...

  9. 查看局域网内在线的主机ip和mac地址

    ]# nmap -sP Starting Nmap 5.51 ( http://nmap.org ) at 2016-12-12 22:43 CST Nmap scan report for 192. ...

  10. SQL 参数,传入参数和自己申明参数——异常抛出

    ALTER PROCEDURE [dbo].[OA_RemoveProject] @Password nvarchar(30), --这是传入的参数 @ProjectNo nvarchar(8) AS ...