JavaScript接口的实现三种方式(推荐)


Posted in Javascript onJune 14, 2016

Javascript模仿接口可以有三种方式:1.注释法 2.检查属性法 3.鸭式辨形法

1.注释法:此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉

/*
interface People{
function createHead();
function createBody();
}
*/
var woman = function(name){ //implements People interface
this.name = name;
}
woman.prototype.showName = function(){
alert(this.name);
}
woman.prototype.createBody = function(){ //实现必要的方法
alert("身体已经创建好");
}
woman.prototype.createHead = function(){
alert("头部已经创建好");
}

//2.属性检查法:把要实现的接口方法添加到类属性列表里,通过定义好的检测反复检查是否已经实现了那些方法
//优缺点:可以强迫程序员实现接口,没实现就报错。不过虽然声明了自己实现了哪些方法,但实现时很可能有遗漏

/*
interface People{
function createHead();
function createBody();
}
*/
var woman = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
woman.prototype.showName = function(){
alert(this.name);
}
woman.prototype.createBody = function(){ //实现必要的方法
alert("身体已经创建好");
}
woman.prototype.createHead = function(){
alert("头部已经创建好");
}
function implement(obj,interfaces){
for(var i=1;i<interfaces.length;i++){
var interfaceName = interfaces[i];
var interfaceFound = false;
for(var j=0;j<obj.implementsInterfaces.length;j++){
if(obj.implementsInterfaces[j] = interfaceName){
interfaceFound = true;
break;
}
}
if(!interfaceFound){
return false;
}
}
return true;
}
function isImplememts(instance,interfaces){ //判断对象是否已经继承相应接口
if(!implement(instance,interfaces)){
throw new Error("Object doesn't implement a required interface");
}
}

3.鸭式辨型法:(不通过外表判断鸭子,而通过其是否有鸭子的特性来判断。如James Whitcomb Riley所说,像鸭子一样走路并且嘎嘎叫的就是鸭子)

上面俩种都声明了自己实现了那些接口,其实声明不重要,实现接口核心的是类实现了接口方法集。如果类具有了接口定义的所有方法函数名相同的函数,那么认为它实现了接口

//接口类,用来创建接口
var Interface = function(name,motheds){
if(agruments.length!=2){
throw new Error("Interface constructor called with "+arguments.length+"arguments,but expected exactly 2");
}
this.name = name;
this.methods = [];
for(var i=0;i<motheds.length;i++){
if(typeof motheds[i] !== 'string'){
throw new Error('Interface constructor expects mothed names to be'+'passes in as a string');
}
this.methods.push(motheds[i]);
}
}
Interface.prototype.ensureImplements = function(objs){
if(agruments.length != 1){
throw new Error("Interface constructor called with "+arguments.length+"arguments,but expected exactly 1")
}
for(var i=0;i<objs.length;i++){
var obj = objs[i];
for(var j=0;j<this.motheds.length;j++){
var mothed = this.methods[j];
if(!obj[mothed] || !typeof obj[mothed] !== 'function'){
throw new Error('Function Interface.ensureImplements:implements interface'+this.name+',obj.mothed'+mothed+'was not found');
}
}
}
}
//创建接口
var People = new Interface('People',['createHead','createBody']);
//子类
var Woman = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
Woman.prototype.showName = function(){
alert(this.name);
}
Woman.prototype.createBody = function(){ //实现必要的方法
alert("女人身体已经创建好");
}
Woman.prototype.createHead = function(){
alert("女人头部已经创建好");
}
//子类
var Man = function(name){
this.name = name;
this.implementsInterfaces = ['People'];
}
Man.prototype.showName = function(){
alert(this.name);
}
Man.prototype.createBody = function(){ //实现必要的方法
alert("男人身体已经创建好");
}
Man.prototype.createHead = function(){
alert("男人头部已经创建好");
}
//判断是否实现
Poeple.ensureImplements(['Woman','Man']);
Javascript 相关文章推荐
accesskey 提交
Jun 26 Javascript
Jquery方式获取iframe页面中的 Dom元素
May 07 Javascript
JavaScript实现网页对象拖放功能的方法
Apr 15 Javascript
javascript实现带下拉子菜单的导航菜单效果
May 14 Javascript
AngularJS+Node.js实现在线聊天室
Aug 28 Javascript
bootstrap导航、选项卡实现代码
Dec 28 Javascript
Vue生命周期示例详解
Apr 12 Javascript
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
Javasript设计模式之链式调用详解
Apr 26 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
vue实现组件之间传值功能示例
Jul 13 Javascript
javascript实现倒计时效果
Feb 17 Javascript
jQuery处理XML文件的几种方法
Jun 14 #Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 #Javascript
深入理解jQuery 事件处理
Jun 14 #Javascript
使用jquery获取url及url参数的简单实例
Jun 14 #Javascript
JS操作JSON方法总结(推荐)
Jun 14 #Javascript
JavaScript Promise 用法
Jun 14 #Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 #Javascript
You might like
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
jQuery获取table行数并输出单元格内容的实现方法
2016/06/30 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
python实现识别相似图片小结
2016/02/22 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python实现扫描日志关键字的示例
2018/04/28 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
django session完成状态保持的方法
2018/11/27 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
python基于socket函数实现端口扫描
2020/05/28 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
实习生的自我评价
2014/01/08 职场文书
财务统计员岗位职责
2015/04/14 职场文书
护士岗位竞聘书
2015/09/15 职场文书
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python