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 相关文章推荐
javascript英文日期(有时间)选择器
May 02 Javascript
JavaScript中Math对象使用说明
Jan 16 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
Javascript页面添加到收藏夹的简单方法
Aug 07 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
Mar 27 jQuery
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
基于JavaScript实现的插入排序算法分析
Apr 14 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
Apr 01 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
Apr 07 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中die(),exit(),return的区别
2013/06/20 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php bootstrap实现简单登录
2016/03/08 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
学习ExtJS accordion布局
2009/10/08 Javascript
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Python netmiko模块的使用
2020/02/14 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
python实现图片转字符画的完整代码
2021/02/21 Python
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
小学教师办公室制度
2014/02/03 职场文书
购房协议书范本
2014/10/02 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
外出听课学习心得体会
2016/01/15 职场文书
python编写函数注意事项总结
2021/03/29 Python