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 相关文章推荐
jQuery的链式调用浅析
Dec 03 Javascript
javascript 获取网页标题代码实例
Jan 22 Javascript
JavaScript避免代码的重复执行经验技巧分享
Apr 17 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
jquery自动补齐功能插件flexselect用法示例
Aug 06 Javascript
JavaScript随机生成颜色的方法
Oct 15 Javascript
JS实现带导航城市列表以及输入搜索功能
Jan 04 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
在微信小程序中渲染HTML内容的方法示例
Sep 28 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
vue与bootstrap实现简单用户信息添加删除功能
Feb 15 Javascript
js实现弹幕墙效果
Dec 10 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
模仿OSO的论坛(四)
2006/10/09 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
学习php开源项目的源码指南
2014/12/21 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
vue-hook-form使用详解
2017/04/07 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
python实现html转ubb代码(html2ubb)
2014/07/03 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
python保留小数位的三种实现方法
2020/01/07 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
企业军训感想
2014/02/07 职场文书
保密承诺书范文
2014/03/27 职场文书
论文评语大全
2014/04/29 职场文书
欢迎标语大全
2014/06/21 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
详解thinkphp的Auth类认证
2021/05/28 PHP