Javascript面向对象详解(第一部分)
2010-09-14 13:43:56 来源:WEB开发网接口在Java或者c#中可以实现多重继承,它将多个类所需继承的一些公共方法抽象出来,接口封装的就是这些公共方法的行为规范,接口规定在其子类中必须实现它所有的方法,所以接口看起来更像一种强制的规定,这种规定使我们能够严格遵守约定,从而实现多个继承类之间的统一.
在Java中,假设有一个形状接口,它规定了作为一个形状所必须拥有的方法,而继承自它的类(例如:圆形类,方形类)必须实现所有的方法,之后假设在某个普通类中我们定义一个方法来计算面积:
public double addAreas(Shape s1,Shape s2)
{
return s1.getArea()+s2.getArea();
}
我们用形状接口定义了参数,这使我们可以自由更改参数的具体类型,例如如果我们实现了一个circle类,它继承自shape接口,那么我们可以如此调用这个方法:......addArea([circle] s1,[circle] s2);
这并不是一个完整而正确的程序,而只是要表达一个意思,就是参数可以用任何实现了接口的类的实例来代替,这就是接口的有用之处,你无需知道形状接口下面继承了什么类,但是可以肯定的是它们都实现了接口的方法,我们在程序中只需要使用接口定义参数类型即可,以后可以用接口的任何子类来代替参数.
在强类型的编程语言中,接口还算一个比较清晰而且较容易实现的功能,而在弱类型的Javascript中实现接口有着前所未有的困难,因为在Javascript中无法预定义变量的类型,像上面的方法只能定义成这样:
function addAreas(s1,s2)
{
return s1.getArea()+s2.getArea();
}
我们可以向参数传入任何类型的对象,而不是接口所提供的严格的约定那样.其实在Javascript中实现真正的接口是不可能的,更何况在Javascript中实现继承也是一件不容易的事情,在Javascript中的接口实际上就是在方法内测试传过来的参数,在此我们给其附加一些约定,这样,我们就实现了一种约定,如果传过来的参数不符合这个约定,方法就不能正常执行,这只是一种类似接口的约定方式.
我们可以定义很多约定,常用的包括检查参数对象中是否包含某个方法.一种复杂一点但是完美无缺的方案是给系统内建的Object顶级对象附加一个方法来判断其内是否包含某个方法:
Object.prototype.implement=function(funcname){
return this&&this[funcname]&&this[funcname] instanceof Funtion;
}
这里应用了前面介绍的反射机制来进行判断对象自身的内容.
这样在方法addAreas(s1,s2)中我们就可以约定s1,s2必须包含getArea()的方法了
写法如下:if(s1.implement("getArea")) ......
还可以限制必须是数字类型:
function isNum(arg){
return parseFloat(arg)!=NaN;
}
parseFloat()将返回参数中的数字部分,NaN是一个非数字的类型,但是因为值为"64any"的字符串也会返回时数字,所以我们将用parseFloat()先去掉所有的非数字部分,然后判断,是否是数字类型.
其他的限制可以自己探索一下,基本原理基本相同,当我们给方法加的限制越多的时候就限制了一个越严谨的接口.
未完,待续
出处:http://www.cnblogs.com/mier
Tags:Javascript 面向 对象
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接