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 相关文章推荐
使用PHP+JQuery+Ajax分页的实现
Apr 23 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
JS简单计算器实例
Jan 20 Javascript
移动设备web开发首选框架:zeptojs介绍
Jan 29 Javascript
JavaScript生成二维码图片小结
Dec 27 Javascript
JavaScript代码生成PDF文件的方法
Feb 26 Javascript
bootstrap table实例详解
Jan 06 Javascript
原生JS实现的轮播图功能详解
Aug 06 Javascript
优雅的处理vue项目异常实战记录
Jun 05 Javascript
javascript操作元素的常见方法小结
Nov 13 Javascript
vue实现pdf文档在线预览功能
Nov 26 Javascript
JS字符串和数组如何实现相互转化
Jul 02 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实现的功能是显示8条基色色带
2006/10/09 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
JS实现禁止高频率连续点击的方法【基于ES6语法】
2017/04/25 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
python3实现基于用户的协同过滤
2018/05/31 Python
python 两个数据库postgresql对比
2019/10/21 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
一份Java笔试题
2012/02/21 面试题
汉语言文学毕业生求职信
2013/10/01 职场文书
投标服务承诺书
2014/05/28 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
党员个人承诺书
2015/04/27 职场文书
论文评审意见
2015/06/05 职场文书
学历证明范文
2015/06/16 职场文书
疾病证明书
2015/06/19 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技