文档章节

javascript接口鸭式辨型法实现

指尖残雪
 指尖残雪
发布于 2016/05/22 23:57
字数 523
阅读 10
收藏 0

鸭式辨型法实现的核心:一个类实现接口的主要目的:把接口里的方法都实现(检测方法)

javascript没有接口的概念,实现接口主要有3种,注解描述,属性检测,鸭式辨型,其中鸭式辨型最为常用

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
        <title>javascript interface</title>
        <script type=text/javascript charset=GBK>
            // 鸭式辨型法实现的核心:一个类实现接口的主要目的:把接口里的方法都实现(检测方法)
            // 一: 接口类 Class Interface ==>实例化N多个接口
            /**
             * 接口类需要2个参数
             * 参数1: 接口的名字 (string)
             * 参数2: 接受方法名称的集合(数组) (array)
             */
			var Interface = function(name , methods){
				//判断接口的参数个数
				if(arguments.length != 2){
					throw new Error('argument.length must be 2');
				}
				this.name = name;
				this.methods = [];//定义一个内置的空数组对象 等待接受methods里的元素(方法名字)
				for(var i = 0, len = methods.length ;i < len; i++ ){
					if(typeof methods[i] != 'string'){
						throw new Error('methods.type must be string');
					}
					this.methods.push(methods[i]);
				}
			}
			
			// 二: 准备工作:
			// 1 实例化接口对象
			var CompositeInterface = new Interface('CompositeInterface' , ['add' , 'remove']);
			var FormItemInterface  = new Interface('FormItemInterface' , ['update','select']);
			//  CompositeImpl implements CompositeInterface , FormItemInterface
			// 2 具体的实现类 
			var CompositeImpl = function(){
					
			} 
			// 3 实现接口的方法implements methods 		
			CompositeImpl.prototype.add = function(){
				alert('add...');
			}
			CompositeImpl.prototype.update = function(){
				alert('update...');
			}
			CompositeImpl.prototype.select = function(){
				alert('select...');
			}
			CompositeImpl.prototype.remove = function(){
				alert('remove...');
			}
			
			// 三:检验接口里的方法
			// 如果检验通过 不做任何操作 不通过:浏览器抛出error
			// 这个方法的目的 就是检测方法的
			Interface.ensureImplements = function(object){
				// 如果检测方法接受的参数小于2个 参数传递失败!
				if(arguments.length < 2){
					throw new Error('Interface.ensureImplements method constructor arguments must be  >= 2!');
				}
				// 获得接口实例对象 
				for(var i = 1; i < arguments.length;i++){
					var instanceInterface = arguments[i];
					if(instanceInterface.constructor != Interface){
						throw new Error('the arguments constructor not be Interface Class');
					}		
					// 循环接口实例对象里面的每一个方法
					for(var j=0;j < instanceInterface.methods.length;j++){
						var methodName = instanceInterface.methods[j];
						// object[key] 就是方法
						if(!object[methodName] || typeof object[methodName] != 'function'){
							throw new Error("the method name '" + methodName + "' is not found !");
						}
					}			
				}
			}
			
			var c1 = new CompositeImpl();
			Interface.ensureImplements(c1,CompositeInterface,FormItemInterface);
			c1.add();
			
            
        </script>
    </head>
    <body>
    </body>
</html>


本文转载自:http://blog.csdn.net/bq1073100909/article/details/49645813

共有 人打赏支持
指尖残雪
粉丝 7
博文 73
码字总数 0
作品 0
上海
后端工程师
TypeScript基础入门 - 接口 - 继承接口

转载地址 TypeScript基础入门 - 接口 - 继承接口 项目实践仓库 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接运行看到输出的结果。 后面自己在练习的时候可以这样使...

durban
08/06
0
0
【摘】【编写可维护的JavaScript】判断javascript中的类型

判断javascript中的类型--编写维护的JavaScript 检测原始值 你希望一个值是字符串、数字、布尔值或undefined,最佳选择是使用typeof运算符 typeof运算符的独特之处在于,将其用于一个未声明的...

jackzlz
2015/08/23
0
0
TypeScript基础入门 - 接口 - 函数类型

转载地址 TypeScript基础入门 - 接口 - 函数类型 项目实践仓库 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接运行看到输出的结果。 后面自己在练习的时候可以这样使...

durban
08/03
0
0
TypeScript基础入门 - 接口 - 可索引的类型

转载地址 TypeScript基础入门 - 接口 - 可索引的类型 项目实践仓库 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接运行看到输出的结果。 后面自己在练习的时候可以这...

durban
08/04
0
0
TypeScript基础入门 - 接口 - 额外的属性检查

转载地址 TypeScript基础入门 - 接口 - 额外的属性检查 项目实践仓库 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接运行看到输出的结果。 后面自己在练习的时候可以...

durban
08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HTTPS is easy

HTTPS is easy https://www.troyhunt.com/https-is-easy/ HTTPS is easy! In fact, it's so easy I decided to create 4 short videos around 5 minutes each to show people how to enable ......

openthings
15分钟前
0
0
bugList 2

用户端: 1. 上传文件时,当选择:彩色-A3-双面时,第二个图片有bug 应改为 和第一个图片的类型相同 2. 确认打印时,三个下拉选目前有bug 应改为:根据后台配置的商家,group by计算出不同城...

勇恒
18分钟前
2
0
keras cnn 网咯 mnist 分类

搭建貌似比tf是简单很多。。。。。 from keras.datasets import mnistfrom keras.utils import np_utilsfrom keras.models import Sequentialfrom keras.layers import Dense, Activat......

阿豪boy
20分钟前
0
0
解决 /var/run/nginx.pid failed

nginx: [error] open() "/var/run/nginx.pid" failed (2: No such file or directory) sudo nginx -c /etc/nginx/nginx.conf nginx -s reload...

驛路梨花醉美
22分钟前
0
0
nginx负载均衡-ssl原理-生成ssl密钥对-nginx配置ssl

nginx负载均衡: 1.创建配置文件 vim /usr/local/nginx/conf/vhost/load.conf #添加以下内容: upstream qq_com #名字自定义,借助此模块定义多个IP,后面...

ZHENG-JY
22分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部