js中接口的声明与实现
实现接口,必须实现接口里的所有方法。
function Interface(name,fns){//声明一个接口类
this.name = name;
this.methods=[];
for(var i=0;i<fns.length;i++){
if(typeof fns[i] != 'string')
throw new Error("方法名必须是字符串,必须传字符串数组");
this.methods.push(fns[i]);
}
}
var face1 = new Interface('face1',['add','edit']);//创建接口对象,该接口声明了两个需要实现的方法add和edit
var face2 = new Interface('face2',['del','save']);
Interface.ensureImplements = function(obj){//定义检测是否实现接口的函数,可以传一个或多个接口对象
if(arguments.length<2){
throw new Error("至少要传两个参数");
}
for(var i=1;i<arguments.length;i++){
if(arguments[i].constructor != Interface){
throw new Error("这个不是接口对象,请传接口对象");
}
for(var j=0;j<arguments[i].methods.length;j++){
if(!(obj[arguments[i].methods[j]]) || typeof obj[arguments[i].methods[j]] != 'function'){
throw new Error("没实现接口里的所有方法");
}
}
}
}
function dd(){//声明一个类实现接口的所有方法
this.name="yes";
this.add=function(){
}
this.del=function(){}
this.edit=function(){}
this.save=function(){}
}
var kk = new dd();
Interface.ensureImplements(kk,face1,face2);//检测kk对象是否实现了face1和face2两个接口
通常,如果一个类的参数是另一个类的对象时,我们会用到接口技术。
function Demo(kk){
Interface.ensureImplements(kk,face1,face2);
this.formaction = kk;//将dd类的对象传给Demo类的formaction属性。
}
Demo.prototype.operation = function(){
var sdata = this.formaction.save();
}
js中接口的声明与实现的更多相关文章
- js中变量的声明
大家都知道js中变量的声明是要提前的,下面有4个样例: 1.if(!"t" in window){ var t = 1; } alert(t);答案是undefine ...
- 简单说明一下JS中的函数声明存在的“先使用,后定义”
首先看一段JS代码,其中使用了两种方式声明了两个函数,分别在不同的地方调用两个函数: <script> 'use strict'; // 输出hello函数 console.log(hel ...
- js 中的变量声明提前总结
一.var 声明 ES6之前,js 中声明变量基本上用 var 关键字: 1.如果访问未声明的变量,会报错:ReferenceError 2.声明了未赋值,值为 undefined,跟前面的报错是两回 ...
- JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链
一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...
- [JavaScript]JS中的变量声明与有效域
1.变量声明 var a = 1; //使用var声明变量 b = 1; //不使用var 第一种情况,在当前域中声明一个名为a的变量,如果实在方法内则为局部变量,若在最外层声明则a为全局变量. 第二 ...
- JS中的函数声明错误
这个问题是JS的函数声明形参部分不带var. ( 额,基础不扎实.)
- Js中有关变量声明和函数声明提升的问题
在ECMAScript5中没有块级作用域一说,只有函数作用域和全局作用域,在其中声明的变量和函数和其他语言的展现形式不同,在某些情况下不一定需要先定义后使用,函数和变量的使用可以在其声明之前,这到底是 ...
- js中的函数声明置顶
函数声明置顶是指 js引擎在读取变量与声明式函数时,会优先读取,例如如下 var a = 1: function a(){}; console.log(a); //这里得到的为1,而不是该functi ...
- js中的函数声明和函数表达式的区别
目录 一.声明与表达式的格式 1.1 声明式的格式: 1.2 表达式的格式: 二.区别 2.1 函数表达式可以直接在后面加括号执行,而函数声明不可以. 2.2 函数表达式可以被提前解析出来 2.3 命 ...
随机推荐
- NEC的学习笔记
写过很多代码后,会有代码的规范有一些需求,会有想写出美观.规范.易懂的代码. 今天学习了NEC,全称Nice Easy CSS(http://nec.netease.com/),顾名思义,就是为了写简 ...
- SharePoint 2013 中代码创建列表查阅项字段
1.首先,打开VS创建两个List Definition,分别是Address和City,如下图: 2.City列表里修改Title为City Name,其实内部名称还是Title,注意一下: 3.给 ...
- File类的常用方法
public static void GetFileInfo() { File file=new File("e:","two.txt ...
- C++map类型
map是键-值对的集合,可以理解为关联数组,可以使用键作为下标来获取一个值 本文地址:http://www.cnblogs.com/archimedes/p/cpp-map.html,转载请注明源地址 ...
- MyBatis入门(二)---一对一,一对多
一.创建数据库表 1.1.创建数据表同时插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybati ...
- iOS--开发之手势解锁
本文主要介绍通过手势识别实现手势解锁功能,这个方法被广泛用于手机解锁,密码验证,快捷支付等功能实现.事例效果如下所示. 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.加载九宫格 ...
- GCD中的dispatch_apply的用法及作用
GCD中的dispatch_apply的用法及作用 (一)dispatch_apply的基本用法 dispatch_apply函数是dispatch_sync函数和Dispatch Group的关联A ...
- 走着官方的教程入门Material Design(一)
又到期末了,学习下Google的材料设计.写下此文记录自己的同时,分享给需要的同学,若发现文中有什么问题和不对,欢迎指出 使用 Material Design 创建新应用 首先需要使用材料主题 如果是 ...
- 原生JS获取各种高度宽度、浏览器窗口滚动条的位置、元素的几何尺寸名
1)关于 pageX, clienX,offsetX,layerX pageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化 clientX:鼠标在页面上可视区域的位 ...
- android文件存储位置切换
最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占 ...