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动态调整iframe高度的方法
Mar 06 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
May 18 Javascript
基于javascript 闭包基础分享
Jul 10 Javascript
jQuery 计算iframe 窗口大小的方法
May 13 Javascript
Bootstrap Table的使用总结
Oct 08 Javascript
VueJS全面解析
Nov 10 Javascript
javascript中的面向对象
Mar 30 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
Dec 06 Javascript
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
利用js-cookie实现前端设置缓存数据定时失效
Jun 18 Javascript
使用 node.js 模仿 Apache 小部分功能
Jul 07 Javascript
JavaScript中的宏任务和微任务详情
Nov 27 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之第六天
2006/10/09 PHP
PHP的类 功能齐全的发送邮件类
2006/10/09 PHP
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
浅析is_writable的php实现
2013/06/18 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
2016/06/17 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
domReady的实现案例
2016/11/23 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
Python栈算法的实现与简单应用示例
2017/11/01 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
python-numpy-指数分布实例详解
2019/12/07 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
前台接待员岗位职责
2014/01/02 职场文书
父亲的菜园教学反思
2014/02/13 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
活动总结报告范文
2014/05/04 职场文书
单位实习介绍信
2015/05/05 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL