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 prototype 原型链
Mar 12 Javascript
Firefox window.close()的使用注意事项
Apr 11 Javascript
ejs v9 javascript模板系统
Mar 21 Javascript
javascript闭包概念简单解析(推荐)
Jun 03 Javascript
jQuery Easyui datagrid连续发送两次请求问题
Dec 13 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
js匿名函数使用&amp;传参(实例)
Sep 08 Javascript
JS计算斐波拉切代码实例
Sep 12 Javascript
vue h5移动端禁止缩放代码
Oct 28 Javascript
jQuery实现弹出层效果
Dec 10 jQuery
js实现贪吃蛇小游戏(加墙)
Jul 31 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
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 缓存函数代码
2008/08/27 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
PHP 解决session死锁的方法
2013/06/20 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
2012/06/14 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
python自动安装pip
2014/04/24 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python 切分数组实例解析
2019/11/07 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
公司JAVA开发面试题
2015/04/02 面试题
《改造我们的学习》心得体会
2014/11/07 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书