(一)javascript定义接口

[b][size=large]什么是接口?[/size]
接口,也可以称为规范,即说明一个对象中应该具有哪些method,规范method应该返回怎样的类型以及结果,这些方法只是一个声明或者暗示它应该做什么事情,并不在意实现者的实现方式[/b]
[b][size=large]接口的好处?[/size]
接口具有很强的自我描述性,告诉我们一个某个类实现了接口的类中一定具有该方法,便于我们的使用和快速的熟悉,从而实现更好的重用。[/b]
[b]
在java中中有关键字interface 来对接口进行说明和描述。
由于javascript是一门弱类型的语言,函数为一等公民,并没有专门来实现对接口的定义和描述。更不说自动检查一个对象是否实现个接口中的全部方法。但是我们通常更喜欢面向对象的方式来进行程序的设计。这样就只能通过我们自己来通过程序代码实现。
[/b]
[b]在java中的接口代码如下[/b]

public interface UserDao{
void add(User u);
void getAll();
}//在IDE中会自动对实现类完成检测

[b]在javascript中由于并没有interface的关键字那就自己写实现吧[/b]

/*
由于javascript是弱类型语言,并没有编译过程,类型检查只能通过
程序员在运行时检测,该类是模拟java接口实现机制的接口类
*/

var Interface = function(InterfaceName,methods){
if(arguments.length <2){
throw new Error("接口中必须定义方法");
};
this.InterfaceName = InterfaceName;
this.methods=[];
for (var i = 0; i <methods.length; i++) {
var method = methods[i];
if(typeof method !== 'string'){
throw new Error("传入的方法名数组必须是字符串");
};
this.methods.push(method);
};
}
/*
检查一个类是否实现个某些接口中的方法静态方法
*/
Interface.checkImpls = function(o){
if(arguments.length <2){
throw new Error("必须传入一个实现类,一个接口");
};
/*从1开始,检查传入的是否是接口对象,不是抛出异常,0是传入的具体对象*/
var myInterface;
for (var i = 1,len = arguments.length; i < len; i++) {
myInterface = arguments[i];
if(myInterface.constructor !== Interface){ //传入的不是接口
throw new Error("checkImpls方法中出入的第"+i+"个参数不是Inteface");
};
for(var j=0,mlen=myInterface.methods.length;j<mlen;j++){
var method = myInterface.methods[j];
if(!o[method] || typeof o[method] !== 'function'){
throw new Error("对象没有实现接口:"+myInterface.InterfaceName+"中的方法:"+method);
};
};

};
};

[b]测试代码[/b]

<html !document>
<head>
<table></table>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="./Interface.js"></script>
<script type="text/javascript">
//javascript 接口测试
var userDao = new Interface("userDao",["add","delete"]);

var userDaoImpl = function(){};
//这里我们完全实现了两个方法
userDaoImpl.prototype.add = function(){};
userDaoImpl.prototype.delete = function(){};
Interface.checkImpls(new userDaoImpl(),userDao);

</script>
</head>
<body>
</body>
<html>

打开浏览器控制台如下图,可以看到是没有问题的
[img]http://dl2.iteye.com/upload/attachment/0097/7128/7ceb3763-6dc1-3ba6-bb4c-31d90575f17d.jpg[/img]
我们把add方法给注释起来
var userDao = new Interface("userDao",["add","delete"]);

var userDaoImpl = function(){};
//userDaoImpl.prototype.add = function(){};
userDaoImpl.prototype.delete = function(){};
Interface.checkImpls(new userDaoImpl(),userDao);

打开浏览器控制台

[img]http://dl2.iteye.com/upload/attachment/0097/7140/f0d6849e-8101-3e98-a484-6c347b0b3bd6.jpg[/img]
这样子是不是就完成了类似于接口的规范了呢,当然没有java接口的强大,不过足以够用了,
接下来是不是改分享继承了呢,呵呵!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值