[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查询),为了优化减少并发时的请求数,做了一个并发时共用请求的优化. 通过单元测试后,想通过手动模拟看下效果,发现优化一直不能生 ...
随机推荐
- Vue爬坑之vuex初识
在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...
- C# 并行任务——Parallel类
一.Parallel类 Parallel类提供了数据和任务的并行性: 二.Paraller.For() Paraller.For()方法类似于C#的for循环语句,也是多次执行一个任务.使用Paral ...
- 初学vitmio,vitmio的环境配置及遇到的坑
1 到官网或者github下载vitamio 官网地址:https://www.vitamio.org/ github地址:https://github.com/yixia/VitamioBundle ...
- NetCore WebSocket 即时通讯示例
1.新建Netcore Web项目 2.创建简易通讯协议 public class MsgTemplate { public string SenderID { get; set; } public ...
- angularJS插入html及更换iframe的src
html: ng-bind-html <div class="tabs_content" ng-bind-html="specialHtml">&l ...
- 实现Ant Design 自定义表单组件
Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...
- MVC之前-ASP.NET初始化流程分析1
Asp.net Mvc是当前使用比较多的web框架,也是比较先进的框架.我打算根据自己的实际项目经验以及相关的源码和一些使用Asp.net Mvc的优秀项目(主要是orchard)来说一说自己对于As ...
- html之改变图片透明度而不改变文字的透明度--两种方法实现
图片与图片上的文字设置不同的透明度的两种方法: 第一种方法:背景图+定位+background: url(timg.jpg)no-repeat; <!DOCTYPE html> <h ...
- C#基础:.NET环境下WebConfig的加密
在将ASP.NET项目部署到服务器上时,内网环境下Web.Config往往是直接复制过去.对于外网环境,则需要对Web.Config文件进行加密. .NET环境下一共提供了2种方式的加密功能,分别是D ...
- Shiro固定身份验证
Shiro基础身份验证 如果要进行shiro的日志信息读取,那么需要使用一个org.apache.shiro.util.Factory接口,在这个接口里面定义有一 取得SecuruityManager ...