现在的位置: 主页 > 主打产品 > 文章正文

JavaScript设计模式之----接口的实现

作者:福州市名人视觉形象设计职业培训学校 来源:www.mrssjy.com 发布时间:2017-09-02 11:20:32
JavaScript设计模式之----接口的实现

1、接口
(1)什么是接口?
接口是提供了一种用以说明一个对象应该具有哪些方法的手段。尽管它可以表明这些方法的语义,但它并不规定这些方法应该如何实现。例如,如果一个接口包含有一个名为setName的方法,那么你有理由认为这个方法的实现应该具有一个字符串参数,并且会把这个参数赋给一个name变量。有了这个工具,你就能按对象提供的特性对它们进行分组。例如,即使一批对象彼此存在着极大的差异,只要它们都实现了Comparable接口,那么在object.compare(anotherObject)方法中就可以互换使用这些对象。你还可以使用接口开发不同的类之间的共同性。如果把原本要求以一个特定的类为参数的函数改为要求以一个特定的接口为参数的函数,那么任何实现了该接口的对象都可以作为参数传递给。这样一来,彼此不相关的对象也可以被同等对待。
(2)接口之利
在面向对象的javascript中,接口有些什么作用呢?既定的一批接口具有自我描述性,并能促进代码的重用。接口可以告诉程序员一个类实现了哪些方法,从而帮助其使用这个类。如果你熟悉一个特定的接口,那么就已经知道如何使用任何实现了它的类,从而更有可能重用现有的类。接口还有助于稳定不同类之前的通信方式。如果事先知道了接口,你就能减少在集成两个对象的过程中出现的问题。借助它,你可以事先就说明你希望一个类具有哪些特性和操作。一个程序可以针对所需要的类定义一个接口,并把它转交给另一个程序。第二个程序员可以随心所欲地编写自己的代码,只要他定义的类实现了那个接口就行。这在大型项目中尤其有用。在大型项目中尤其有用。
测试和调式因此也能变得更轻松。在javascript这种弱类型语言中,类型不匹配错误很难跟踪。使用接口可以让这种错误的查找变午更容易一点,因为此时如果一个对象不像所要求的类型,或者没有实现必要的方法,那么你会得到包含有用信息的明确的错误提示。这样一来,逻辑错误可以被限制在方法自身,而不是在对象构成之中。接口还能让代码变得更稳固,因为对接口的任何改变在所有实现它的类都必须体现出来。如果接口添加了一个操作,而某个实现它的类并没有相应的添加这个操作,那么你肯定会立即见到一个错误。
(3)接口之弊
接口并没非没有缺点。javascript是一种具有极强表现图片的语言,这主要得益于其弱类型的特点。而接口的使用则一定程序上强化了类型的作用。这降低了语言的灵活性。
javascript并没有提供对接口的内置支持,而试图模仿其它语言内置的功能总会有一些风险。javascript没有interface这个关键词,因此不管你用什么方法实现接口,它总是与C++和java这些语言的方法大相径庭,这加大了初涉javascript时所遇的困难。
javascript中任何实现接口的方法都会性能造成一些影响,在某种程序上这得归咎于额外的方法调用的开销。我们的实现方法中使用了两个for循环来遍历所需要的每个接口中的每个方法。对于大型接口和需要实现许多不同接口的对象,这种检查可能要花点时间,从而对性能造成负面影响。在乎这个问题,那么 可以开必完成之后剔除这种代码,或者将其执行与一个调试标志关联起来,这样在运营环境中它就会执行。但要注意不要过早进行优化处理。firebug这类性能分析器可以帮助你判断是否真有必要剔除接口代码。
js中接口使用的最大问题在于,无法强迫其他程序员遵守你定义的接口。在其它语言中,接口的概念是内置的,如果某人定义了实现一个接口的类,那么编译器会确保该类的确实现了这个接口。而在javascript中则必须用手工的办法保证某个类实现了一个接口。编码规范和辅助类可以提供一些帮助,但无法彻底根除这个问题。如果项目的其他程序员不认真对待接口,那么这些接口的使用是无法得到强制性保证的。除非项目的所有人都同意使用接口并对其进行检查,否则接口的很多价值都无从体现。

2、在javascript中模仿接口
javascript中模仿接口的三种方法:
1、注解描述方式
2、属性检查法
3、鸭式辨型法
没有哪种技术是完美的,但三者结合使用基本上可以令人满意。
用注释描述接口
用注释模仿接口是最简单的方法,但效果却是最差的。这种方法模仿其他页面对象语言中的做法,使用了interface和implements关键字,但把它们放在注释中,以免引起语法错误。如下:

<script> //javascript中定义接口的方式有三种: //1、注解描述的方式 /** * interface Composite{ * function add(obj); * function remove(obj); * function update(obj); } 优点:程序员可以有参考 缺点:缺点一大堆,他只是一个借口的文档范畴,假如不实现 所有的方法,程序照样可以运行,太松散了。 */ // Implement of interface Composite var CompositeImpl =function(){ /* this.add = function(obj){ }; this.remove = function(obj){ }; 这种函数定义的方法,在实例化一个对象的时候,new 一个示例,将产生一个方法,且各个实力的方法还不一样。 所以采用下面的方法: */ CompositeImpl.prototype.add = function(obj){ } CompositeImpl.prototype.remove = function(obj){ } CompositeImpl.prototype.update = function(obj){ } } var c1 = new CompositeImpl(); var c2 = new CompositeImpl() alert(c1.add == c2.add) //2、属性检测 //3、鸭式辨型 </script>

2、属性检测法
这种方法更严谨一点。所有类都明确地声明自己实现了哪些接口,那些想与这些类打交道的对象可能针对这些声明进行检查。那些接口自身仍然只是注释,但现在你可以通过检查一个属性得知某个类自称实现了什么接口
这种模仿并不是很好。它没有为确保CompositeForm真正实现了正确的方法集而进行检查,也不会抛出错误以告知程序员程序中的问题。说到底它主要还是属于程序文档范畴。在这种做法中,对接口约定的遵守完全依靠自觉。
尽管如此,这种方法也有其优点。它易于实现,不需要额外的类或函数。它可以提高代码的可重用性,因为现丰那些类实现的的接口都有说明,程序员可以把它们与其他实现了同样接口的类互换使用。这种方法并不影响文件尺寸或执行速度,因为它所用的注释可以在对代码进行部署时,不费吹灰之图片地予以剔除。但是,由于不会提供错误消息,它对测试和调式没有什么帮助。

<script> /** * interface Composite{ * function add(obj); * function remove(obj); * function update(obj); * } * interface FormItem{ * function select(obj); * } */ // CompositeImpl implements interface Composite,FormItem var CompositeImpl =function(){ //显示在类的内部,接收所实现的借口,一般来说,这是一个规范, // 我们项目经理:在内部类定义一个数组,名字要固定 this.interfaceImplments = ['Composite','FormItem']; CompositeImpl.prototype.add = function(obj){ alert(小平果); } CompositeImpl.prototype.remove = function(obj){ } CompositeImpl.prototype.update = function(obj){ } /*CompositeImpl.prototype.select = function(obj){ }*/ } //定义函数检测,判断当前对象是否实现了所有的接口 function checkCompositeImpl (instance){ if (!isImplments(instance,'Composite','FormItem')) { throw new Error('Object cannot implements all the interface'); }; } //公用的具体检测方法(核心方法),主要目的就是判断示例对象有没有实现相关的接口; function isImplments(object){ //arguments 对象会的函数的实际对象 for (var i = 1, len = arguments.length; i < len; i++) { //接收实现每一个接口的名字 var interfaceName = arguments[i]; //判断此方法到底是实现了还是失败了?规范里定义了interfaceImplments. var interfaceFound =false; for (var j = 0;j实例化N多个接口 /** *接口类的参数?几个 * 参数1:接口名 * 参数2:接收方法的集合(数组) */ var Interface = function(name , methods){ //判断接口的参数个数 if (arguments.length !=2) { throw new Error('the instance interface constructor arguments should be 2'); }; this.name =name; //this.methods = methods; this.methods = []; for (var i = 0, len = methods.length; i

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉SEO http://www.feimao666.com

上一篇:卡汀财经资讯—CFA﹑FRM赶紧学起来 下一篇:最后一页