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. C# 对象操作

    //********************************************************************************* //************** ...

  2. JavaScript实现字符串的contains函数

    JavaScript实现字符串的contains函数 / *  * string:原始字符串  * substr:子字符串  * isIgnoreCase:忽略大小写  * / function co ...

  3. python基础——map/reduce

    python基础——map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Pro ...

  4. Swift - 开源框架总结

    苹果官方Swift文档<The Swift Programming Language> 苹果开发者Swift文档及介绍 网友整理的Swift中文文档< Apple Swift编程语言 ...

  5. 通过mysql命令行理解mysql

    引言:工具不可谓给我们的生活带来了便利,但有些时候我们却忘记了事物本身的意义.在大多数人都在追捧甚至是盲从各种各样的工具有多先进的时候,你是否有反思过:你目前是否有使用它的资格. 假设你学会了使用一款 ...

  6. PHP中 字符串 常用函数

    //strpos    查找字符串中是否含有字符 $str='abcde'; $char='a':   if(strpos($str,$char) !==false){    echo '含有',$c ...

  7. -A 解决数据库表太多,预读表时间很长

    Reading table information for completion of table and column names You can turn off this feature to ...

  8. jQuery each用法及each解析json

    $(function(){ $("button").click( function(){ var a1=""; var a2=""; var ...

  9. svn删除所有.svn文件

    svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \;

  10. 运用ASMIOSTAT脚本监控asm disk磁盘性能

    1,脚本作用: 类似于OS的iostat检查磁盘的I/O性能,ASMIOSTAT 脚本用来检查ASM磁盘的性能, 2,下载AMSIOSTAT脚本http://files.cnblogs.com/fil ...