[js] 实现接口
摘要
js 语言并没有interface implement 关键字,如果要做到和后端语言类似的接口,一般会需要模拟实现。
在oo 编程中, 接口可以让架构师规定好模块必须要实现的方法, 尽量解耦模块。
实现接口的方法
第一种 注释法 , 只是一种约定,约束太小,而且不能保证接口是否完全实现
/*
interface Composite{
function add(child);
}
interface fromItem{
function save();
}
*/
var CompositeForm = function(id, method, action){
};
CompositeForm.prototype.add = function(child){
};
CompositeForm.prototype.save = function(){
};
第二种方法 属性判断, 虽然可以保证每个接口都实现,但是接口的方法是否实现也没法保证。
/*
interface Composite{
function add(child);
}
interface fromItem{
function save();
}
*/
var CompositeForm = function(){
this.implementsInterfaces = ['Composite', 'FormItem']; //声明自己继承的接口
};
function addForm(formInstance){
if(!implements(formInstance, 'Composite', 'FormItem')){ //检查实例formInstance是否实现了接口
throw new Error('Object does not implement a required interface');
}
}
function implements(object){ //检查算法,双重循环
for(var i=1; i<arguments.length; i++){
var interfaceName = arguments[i];
var interfaceFound = false;
for(var j=0; j<object.implementsInterfaces.length; j++){
if(object.implementsInterfaces[j] == interfaceName){
interfaceFound = true;
break;
}
}
if(!interfaceFound){
return false;
}
}
return true;
}
addForm(new CompositeForm());
第三种 鸭式辨型模仿接口 , 可以保证 实现每个 接口的方法, 但是引入了 Interface 这些类。
//Constructor
var Interface = function(name, methods){ //将接口的方法保存在this.methods中用以将来的检测
if(arguments.length != 2){
throw new Error('Interface constructor called with '+arguments.legth+
" arguments, but exected exactly 2.");
}
this.name = name;
this.methods = [];
for(var i=0, len = methods.length; i<len; i++){
if(typeof methods[i] !== 'string'){
throw new Error('Interface constructor expects method names to be passed in as a string.');
}
this.methods.push(methods[i]);
}
};
Interface.ensureImplements = function(object, arguments){
if(arguments.length < 2){
throw new Error('Function Interface.ensureImplements called with'+arguments.length+
"arugments, but expected at least 2.");
}
for (var i=0, len = arguments.length; i<len; i++){
var intf = arguments[i];
if(intf.constructor !== Interface){
throw new Error('Function Interface.ensureImplements expects arguments'+
"two and above to be instances of Interface.");
}
for(var j=0, methodsLen = intf.methods.length; j < methodsLen; j++){
var method = intf.methods[j];
//通过methods检查实例是否实现了接口
if(!object[method] || typeof object[method]!=='function'){
throw new Error('Function Interface.ensureImplements:object'+
" doesnot implement the"+intf.name+
" interface. Method "+method+" was not found!");
}
}
}
};
var Composite = new Interface('Composite', ['add']); //声明接口拥有的方法
var FormItem = new Interface('FormItem', ['save']); //声明接口拥有的方法
var compositeForm = function(id, method, action){//implements Composite, FormItem
};
compositeForm.prototype.add = function () {};
compositeForm.prototype.save = function () {};
function addForm(formInstance){
Interface.ensureImplements.call(this, formInstance, [Composite, FormItem]);
}
addForm(new compositeForm());
[js] 实现接口的更多相关文章
- html中通过js获取接口JSON格式数据解析以及跨域问题
前言:本人自学前端开发,一直想研究下js获取接口数据在html的实现,顺利地找到了获取数据的方法,但是有部分接口在调用中出现无法展示数据.经查,发现时跨域的问题,花费了一通时间,随笔记录下过程,以方便 ...
- 【转】js生成接口请求参数签名加密
js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...
- js生成接口请求参数签名加密
js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再 ...
- 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程
一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...
- 项目中angular js的接口url统一管理
为了防止环境改变时需要修改多处接口的url,项目中用到了一个config.json文件来统一管理url: 在src下建立config文件夹,创建config.json文件,主要内容如下: { &quo ...
- 微信js SDK接口
微信JS-SDK说明文档 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 一.微信登录功能 在进行微信OAut ...
- js 设计模式-接口
js模拟java接口检测函数:确保子类实现接口中的方法:(出自js设计模式) 上代码: <script type="text/javascript" > <%-- ...
- 如何通过js调用接口
例如一个接口的返回值如下:var returnCitySN = {"cip": "221.192.178.158", "cid": &quo ...
- node.js http接口调试时请求串行特性分析
缘起: 产品业务上有个类数据库服务的请求时间比较长(类似mysql的sql查询),为了优化减少并发时的请求数,做了一个并发时共用请求的优化. 通过单元测试后,想通过手动模拟看下效果,发现优化一直不能生 ...
随机推荐
- redis学习(2)--- Redis概述
一.Redis介绍 高性能键值对数据库,支持的键值对数据类型: 字符串类型 列表类型 有序集合类型 散列类型 集合类型 官方测试读写速度: 测试50个并发程序,执行10万次请求 读的速度:每秒11万次 ...
- 关于安卓百度地图SDK报错:Multiple dex files define Lcom/baidu/android/bbalbs/common/a/a;
1.找到.jar包 2.右键,用WinRAR打开 3.打开com/baidu/ 4.保留location,其他全删掉 5.这样将不会报错,可以运行了!!!
- python学习笔记之列表与元组
一.概述 python包含6种内建的序列,其中列表和元组是最常用的两种类型.列表和元组的主要区别在于,列表可以修改,元组则不能修改 使用上,如果要根据要求来添加元素,应当使用列表:而由于要求序列不可修 ...
- git常用命令,助你快速入门
git是程序员中最常用的版本控制工具,学会git的基本使用是十分重要,特别是在公司里面的协同开发,废话不多说,下面贴出常用的命令. 1.基本配置 # 既然git是多人协同的工具,别人要看到你提交代码的 ...
- SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)
1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...
- Linq之关键字基本查询
子句 说明 from 指定数据源和范围变量(类似于迭代变量). where 根据一个或多个由逻辑"与"和逻辑"或"运算符(&& 或 ||)分隔的 ...
- java 实例变量的初始化
1.对于实例变量,该类没创建一次实例,就需要为实例变量分配一块内存空间:2.程序通过Person对象来访问eyeNum类变量时,底层依然会转换为通过Person访问eyeNum类变量:3.当Perso ...
- arcgis api for js入门开发系列九热力图效果
上一篇实现了demo的聚合效果,本篇新增热力图效果,截图如下: 热力图效果实现的思路如下: 1.map.js初始化函数调用聚合效果的js接口,map.heatmap.js实现聚合核心效果的js文件 / ...
- jquery让页面滚动到底部
function scrollToEnd(){//滚动到底部 var h = $(document).height()-$(window).height(); $(document).scrollTo ...
- jQuery淡入淡出的轮播图
html结构: <div class="banna"> <ul class="img"> ...